我目前有一个类似这样的模板函数:
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
是固定的,我无法控制。
谢谢!
最佳答案
作为替代
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, .....);
}
关于c++ - 基于模板参数值的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38830759/