#include <cstddef>
#include <utility>
#include <string>
#include <map>
enum TestEnum {
BeginVal = 0,
One = BeginVal,
Two,
Three,
EndVal
};
template<TestEnum e>
struct MapEntry {
enum { val = e };
std::string s;
MapEntry( std::string s_ ):s(s_) {}
};
void do_in_order() {}
template<typename F0, typename... Fs>
void do_in_order(F0&& f0, Fs&&... fs) {
std::forward<F0>(f0)();
do_in_order( std::forward<Fs>(fs)... );
}
template<typename... MapEntries>
struct count_entries:std::integral_constant< std::size_t, sizeof...(MapEntries) > {};
// should also detect duplicates and check the range of the values:
template<typename... MapEntries>
struct caught_them_all:
std::integral_constant<
bool,
count_entries<MapEntries...>::value == (TestEnum::EndVal-TestEnum::BeginVal)
>
{};
struct BuildMap {
typedef std::map<std::string, TestEnum> result_map;
mutable result_map val;
operator result_map() const {
return std::move(val);
}
template<typename... MapEntries>
BuildMap( MapEntries&&... entries ) {
static_assert( caught_them_all<MapEntries...>::value, "Missing enum value" );
bool _[] = { ( (val[ entries.s ] = TestEnum(MapEntries::val)), false )... };
}
};
std::map< std::string, TestEnum > bob = BuildMap(
MapEntry<One>("One")
,MapEntry<Two>("Two")
#if 0
,MapEntry<Three>("Three")
#endif
);
int main() {}
I2luY2x1ZGUgPGNzdGRkZWY+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgoKZW51bSBUZXN0RW51bSB7CiAgIEJlZ2luVmFsID0gMCwKICAgT25lID0gQmVnaW5WYWwsCiAgIFR3bywKICAgVGhyZWUsCiAgIEVuZFZhbAp9OwoKdGVtcGxhdGU8VGVzdEVudW0gZT4Kc3RydWN0IE1hcEVudHJ5IHsKICBlbnVtIHsgdmFsID0gZSB9OwogIHN0ZDo6c3RyaW5nIHM7CiAgTWFwRW50cnkoIHN0ZDo6c3RyaW5nIHNfICk6cyhzXykge30KfTsKCnZvaWQgZG9faW5fb3JkZXIoKSB7fQp0ZW1wbGF0ZTx0eXBlbmFtZSBGMCwgdHlwZW5hbWUuLi4gRnM+CnZvaWQgZG9faW5fb3JkZXIoRjAmJiBmMCwgRnMmJi4uLiBmcykgewogIHN0ZDo6Zm9yd2FyZDxGMD4oZjApKCk7CiAgZG9faW5fb3JkZXIoIHN0ZDo6Zm9yd2FyZDxGcz4oZnMpLi4uICk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lLi4uIE1hcEVudHJpZXM+CnN0cnVjdCBjb3VudF9lbnRyaWVzOnN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8IHN0ZDo6c2l6ZV90LCBzaXplb2YuLi4oTWFwRW50cmllcykgPiB7fTsKCi8vIHNob3VsZCBhbHNvIGRldGVjdCBkdXBsaWNhdGVzIGFuZCBjaGVjayB0aGUgcmFuZ2Ugb2YgdGhlIHZhbHVlczoKdGVtcGxhdGU8dHlwZW5hbWUuLi4gTWFwRW50cmllcz4Kc3RydWN0IGNhdWdodF90aGVtX2FsbDoKICAgIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CgkJYm9vbCwKCQljb3VudF9lbnRyaWVzPE1hcEVudHJpZXMuLi4+Ojp2YWx1ZSA9PSAoVGVzdEVudW06OkVuZFZhbC1UZXN0RW51bTo6QmVnaW5WYWwpCgk+Cnt9OwoKc3RydWN0IEJ1aWxkTWFwIHsKICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUZXN0RW51bT4gcmVzdWx0X21hcDsKICBtdXRhYmxlIHJlc3VsdF9tYXAgdmFsOwogIG9wZXJhdG9yIHJlc3VsdF9tYXAoKSBjb25zdCB7CiAgICByZXR1cm4gc3RkOjptb3ZlKHZhbCk7CiAgfQogIHRlbXBsYXRlPHR5cGVuYW1lLi4uIE1hcEVudHJpZXM+CiAgQnVpbGRNYXAoIE1hcEVudHJpZXMmJi4uLiBlbnRyaWVzICkgewogICAgc3RhdGljX2Fzc2VydCggY2F1Z2h0X3RoZW1fYWxsPE1hcEVudHJpZXMuLi4+Ojp2YWx1ZSwgIk1pc3NpbmcgZW51bSB2YWx1ZSIgKTsKICAgIGJvb2wgX1tdID0geyAoICh2YWxbIGVudHJpZXMucyBdID0gVGVzdEVudW0oTWFwRW50cmllczo6dmFsKSksIGZhbHNlICkuLi4gfTsKICB9Cn07CgpzdGQ6Om1hcDwgc3RkOjpzdHJpbmcsIFRlc3RFbnVtID4gYm9iID0gQnVpbGRNYXAoCglNYXBFbnRyeTxPbmU+KCJPbmUiKQoJLE1hcEVudHJ5PFR3bz4oIlR3byIpCiNpZiAwCgksTWFwRW50cnk8VGhyZWU+KCJUaHJlZSIpCiNlbmRpZgopOwoKaW50IG1haW4oKSB7fQoK
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]