我目前有一个类似的模板函数:
enum class MyEnum { ENUM_1, ENUM_2, ENUM_3 };
template<MyEnum e, typename T>
void func( int i )
{
std::vector<T> someData = ......;
T someValue;
switch( e )
{
case ENUM_1:
someValue += func1( someData );
break;
case ENUM_2:
someValue += func2( someData );
break;
case ENUM_3:
someValue += func3( someData );
break;
}
}
类型T
取决于e
的值。我想写这个代码像
template<MyEnum e>
void func( int i )
{
if( e = MyEnum:ENUM_1 ) T = char;
else T = float;
std::vector<T> someData = ......;
T someValue;
switch( e )
{
case ENUM_1:
someValue += func1( someData, ..... );
break;
case ENUM_2:
someValue += func2( someData, ..... );
break;
case ENUM_3:
someValue += func3( someData, ..... );
break;
}
}
我可以看到如何使类型依赖于另一种类型,例如
typedef std::conditional<std::is_same<T1, float>::value, char, float>::type T;
但无法弄清楚如何扩展它以应对枚举值。有可能做我想做的事吗?如果是这样,怎么样?
注意:func1
,func2
和func3
已修复且无法控制。
谢谢!
答案 0 :(得分:7)
替代
using T = std::conditional_t<e == MyEnum::ENUM_1, char, float>;
您可以创建特征,例如:
template <MyEnum> struct helper_fun;
template <> struct helper_fun<MyEnum::ENUM_1>
{
using type = char;
static constexpr char (*f)(const std::vector<char>&) = &func1;
};
template <> struct helper_fun<MyEnum::ENUM_2>
{
using type = float;
static constexpr float (*f)(const std::vector<float>&) = &func2;
};
然后(不再切换)
template<MyEnum e>
void func( int i )
{
using T = typename helper_fun<e>::type;
std::vector<T> someData = ......;
T someValue;
someValue += helper_fun<e>::f(someData, .....);
}
答案 1 :(得分:3)
std::conditional
的第一个模板参数只是一个普通的bool
,所以你可以把你的逻辑推到那里:
using T = typename std::conditional<(e == MyEnum::ENUM_1), char, float>::type;
using T = std::conditional_t<(e == MyEnum::ENUM_1), char, float>; //C++14