fork(2) download
  1. #include <cstddef>
  2. #include <utility>
  3. #include <string>
  4. #include <map>
  5.  
  6. enum TestEnum {
  7. BeginVal = 0,
  8. One = BeginVal,
  9. Two,
  10. Three,
  11. EndVal
  12. };
  13.  
  14. template<TestEnum e>
  15. struct MapEntry {
  16. enum { val = e };
  17. std::string s;
  18. MapEntry( std::string s_ ):s(s_) {}
  19. };
  20.  
  21. void do_in_order() {}
  22. template<typename F0, typename... Fs>
  23. void do_in_order(F0&& f0, Fs&&... fs) {
  24. std::forward<F0>(f0)();
  25. do_in_order( std::forward<Fs>(fs)... );
  26. }
  27.  
  28. template<typename... MapEntries>
  29. struct count_entries:std::integral_constant< std::size_t, sizeof...(MapEntries) > {};
  30.  
  31. // should also detect duplicates and check the range of the values:
  32. template<typename... MapEntries>
  33. struct caught_them_all:
  34. std::integral_constant<
  35. bool,
  36. count_entries<MapEntries...>::value == (TestEnum::EndVal-TestEnum::BeginVal)
  37. >
  38. {};
  39.  
  40. struct BuildMap {
  41. typedef std::map<std::string, TestEnum> result_map;
  42. mutable result_map val;
  43. operator result_map() const {
  44. return std::move(val);
  45. }
  46. template<typename... MapEntries>
  47. BuildMap( MapEntries&&... entries ) {
  48. static_assert( caught_them_all<MapEntries...>::value, "Missing enum value" );
  49. bool _[] = { ( (val[ entries.s ] = TestEnum(MapEntries::val)), false )... };
  50. }
  51. };
  52.  
  53. std::map< std::string, TestEnum > bob = BuildMap(
  54. MapEntry<One>("One")
  55. ,MapEntry<Two>("Two")
  56. #if 0
  57. ,MapEntry<Three>("Three")
  58. #endif
  59. );
  60.  
  61. int main() {}
  62.  
  63.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In instantiation of ‘BuildMap::BuildMap(MapEntries&& ...) [with MapEntries = {MapEntry<(TestEnum)0u>, MapEntry<(TestEnum)1u>}]’:
prog.cpp:59:1:   required from here
prog.cpp:48:5: error: static assertion failed: Missing enum value
prog.cpp:49:10: warning: unused variable ‘_’ [-Wunused-variable]
stdout
Standard output is empty