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)]();
}