c++ - std::initializer_list 值作为模板参数

标签 c++ templates initializer-list

我正在尝试做这样的事情:

template<typename enumType,
         std::initializer_list<enumType> values,
         std::initializer_list<std::string> mappings>
struct enum_converter {
    enumType toEnum(const std::string& literal) { ... }
    std::string toString(const enumType value) { ... }
};

我想按如下方式使用它:

enum test_enum {value_a, value_b};
struct test_enum_converter : public enum_converter<
        test_enum,
        {value_a, value_b},
        {"a", "b"}> {};

GCC 告诉我:

class std::initializer_list<_Tp> is not a valid type
for a template constant parameter.

向类型添加 const 不会改变任何内容。是否有解决方法或类似的解决方案?

最佳答案

只允许整数类型、枚举、指针和引用作为非类型模板参数。 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"});
}

关于c++ - std::initializer_list 值作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17168771/

相关文章:

c++ - Qt:当你没有子类化 QThread 时如何清理它?

c++ - 我的通用模板应该使用 T 还是 T&&?

c++ - 迭代模板 int

c++ - std::vector 的模板推导指南:其他 std 类型的限定/非限定名称

initialization - 如何使用统一初始值设定项 "reduce typing to create C++ types"?

c++ - 使用数字占位符从文件中按字母顺序排序

c++ - 如何安全地重载 std::unique_ptr 的自定义删除器?

c++ - 在 C++ 中重定向

c++ - std::initializer_list: error C2064: term 不计算为采用 0 个参数的函数

c++ - 初始化列表作为 operator[] 的参数