fork download
  1. #include <map>
  2. #include <string>
  3. #include <iostream>
  4.  
  5. template<typename T>
  6. struct disable_default
  7. {
  8. T& get_default()
  9. {
  10. throw 1;
  11. }
  12.  
  13. const T& get_default() const
  14. {
  15. throw 1;
  16. }
  17. };
  18.  
  19. template<typename T>
  20. struct enable_default
  21. {
  22. template<typename Value>
  23. enable_default(Value&& def_value) : default_value(std::forward<Value>(def_value))
  24. {
  25. }
  26.  
  27. const T& get_default() const
  28. {
  29. return default_value;
  30. }
  31.  
  32. T& get_default()
  33. {
  34. return default_value;
  35. }
  36.  
  37. private:
  38. T default_value;
  39. };
  40.  
  41. template<typename K, typename T, template <typename> class default_policy = enable_default, typename key_comp = std::less<K>>
  42. struct selector : public default_policy<T>
  43. {
  44. template<typename Value>
  45. selector(Value&& def_value) : default_policy<T>(std::forward<Value>(def_value))
  46. {
  47. }
  48.  
  49. selector()
  50. {
  51. }
  52.  
  53. struct selector_proxy
  54. {
  55. selector_proxy(std::map<K,T, key_comp>& sel_map, const K& pKey) : selector_map(sel_map), key(pKey)
  56. {
  57. }
  58.  
  59. template<typename Val>
  60. selector_proxy& operator=(Val&& pValue)
  61. {
  62. auto it = selector_map.find(key);
  63. if ( it != end(selector_map) )
  64. {
  65. it->second = std::forward<Val>(pValue);
  66. }
  67. else
  68. {
  69. selector_map.insert(std::make_pair(key, std::forward<Val>(pValue)));
  70. }
  71. }
  72.  
  73. private:
  74. std::map<K,T,key_comp>& selector_map;
  75. const K& key;
  76. };
  77.  
  78. selector_proxy at(const K& key)
  79. {
  80. return selector_proxy(selector_map, key);
  81. }
  82.  
  83. T& get(const K& key)
  84. {
  85. return const_cast<T&>(static_cast<const selector*>(this)->get(key));
  86. }
  87.  
  88. const T& get(const K& key) const
  89. {
  90. auto it = selector_map.find(key);
  91. if ( it != end(selector_map) )
  92. {
  93. return it->second;
  94. }
  95. else
  96. {
  97. return default_policy<T>::get_default();
  98. }
  99. }
  100.  
  101. private:
  102. std::map<K,T,key_comp> selector_map;
  103. };
  104.  
  105. using namespace std;
  106.  
  107. int main()
  108. {
  109. selector<string, int> d_sel_1(0);
  110. d_sel_1.at("one") = 1;
  111. d_sel_1.at("two") = 2;
  112. cout << d_sel_1.get("one") << endl;
  113. cout << d_sel_1.get("three") << endl;
  114.  
  115. selector<string, int, disable_default> nd_sel {};
  116. try
  117. {
  118. cout << nd_sel.get("one") << endl;
  119. }
  120. catch(...)
  121. {
  122. cout << "not found" << endl;
  123. }
  124. }
Success #stdin #stdout 0s 2988KB
stdin
Standard input is empty
stdout
1
0
not found