非型テンプレート パラメーターとして使用できるのは、整数型、列挙型、ポインター、および参照のみです。std::initializer_list
そのどちらでもありません。
値とマッピングをテンプレート パラメータにする必要がありますか? それらをコンストラクターの通常のパラメーターにし、列挙型のみをテンプレートパラメーターとして保持するのはどうですか?
template<typename enumType>
struct enum_converter {
enum_converter(std::initializer_list<enumType> values, std::initializer_list<std::string> mappings) : values(values), mappings(mappings)
enumType toEnum(const std::string& literal) { ... }
std::string toString(const enumType value) { ... }
private:
std::initializer_list<enumType> values;
std::initializer_list<std::string> mappings;
};
enum_converter<test_enum> test_enum_converter({...}, {...});
int main()
{
test_enum_converter.toEnum("bla");
}
編集
インスタンスフリーの代替案は次のとおりです。
template<typename enumType>
struct enum_converter {
static init(std::initializer_list<enumType> values, std::initializer_list<std::string> mappings)
{ s_values = values; s_mappings = mappings; }
static enumType toEnum(const std::string& literal) { ... }
static std::string toString(const enumType value) { ... }
private:
static std::initializer_list<enumType> s_values;
static std::initializer_list<std::string> s_mappings;
};
init()
クラスを使用する前に一度呼び出すだけです。
特定の列挙型に対して複数のインスタンス化が必要な場合は、次のように曖昧さ回避パラメーターをテンプレートに追加できます。
template <typename enumType, typename tag>
struct enum_converter { /*as before*/ };
int main()
{
struct data_strings;
struct user_readable_strings;
enum_converter<test_enum, data_strings>::init({...}, {"a", "b"});
enum_converter<test_enum, user_readable_strings>::init({...}, {"Option A", "Option B"});
}