Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 元程序在运行时将枚举数值用作模板函数的模板参数_C++_Templates_Enums_Metaprogramming - Fatal编程技术网

C++ 元程序在运行时将枚举数值用作模板函数的模板参数

C++ 元程序在运行时将枚举数值用作模板函数的模板参数,c++,templates,enums,metaprogramming,C++,Templates,Enums,Metaprogramming,假设我有以下代码: // the enumerator enum class my_enum { ONE, TWO, THREE }; // the function template <my_enum E> int foo() { return 0; } // a specialization template<> int foo<my_enum::TWO>() { return 1; } 使用一些额外的技巧来处

假设我有以下代码:

// the enumerator
enum class my_enum {
    ONE,
    TWO,
    THREE
};

// the function
template <my_enum E>
int foo() {
    return 0;
}

// a specialization
template<>
int foo<my_enum::TWO>() {
    return 1;
}
使用一些额外的技巧来处理意外值,并添加开关的默认值。不幸的是,对于很长的枚举数,此解决方案会带来很长的冗余代码,这很难维护


是否有任何元编程解决方案可以简化此代码,例如使用Boost Hana或Boost MPL?

如果枚举值(如您的示例中)从零开始且连续。。。给定一个助手函数,如下所示

template <std::size_t ... Is>
std::array<int(*)(void), sizeof...(Is)>
    getFuncArray (std::index_sequence<Is...>)
 { return {{ &foo<static_cast<my_enum>(Is)>... }}; }

相关/可能重复:。这里有一个MPL答案。逻辑很好,但不幸的是,它只有在枚举从零开始并且是连续的情况下才有效:(@GiovanniCerretani-不幸的是。当枚举值稀疏时,您也可以使用映射而不是数组;但我不知道如何初始化映射。
template <std::size_t ... Is>
std::array<int(*)(void), sizeof...(Is)>
    getFuncArray (std::index_sequence<Is...>)
 { return {{ &foo<static_cast<my_enum>(Is)>... }}; }
int bar (my_enum value)
 {
   static auto const arrF
      = getFuncArray(std::make_index_sequence<
                        1u+static_cast<std::size_t>(my_enum::THREE)>{});

   return arrF[static_cast<std::size_t>(value)]();
 }