根据模板参数值键入

use*_*401 2 c++ visual-c++ c++11

我目前有一个模板功能,如下所示:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

类型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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以看到如何使类型依赖于另一种类型,例如

typedef std::conditional<std::is_same<T1, float>::value, char, float>::type T;
Run Code Online (Sandbox Code Playgroud)

但无法弄清楚如何扩展它以应对枚举值.有可能做我想做的事吗?如果是这样,怎么样?

注:func1,func2并且func3是固定的,超出了我的控制.

谢谢!

Jar*_*d42 7

作为替代

using T = std::conditional_t<e == MyEnum::ENUM_1, char, float>;
Run Code Online (Sandbox Code Playgroud)

您可以创建特征,例如:

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;
};
Run Code Online (Sandbox Code Playgroud)

然后(不再切换)

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, .....);
}
Run Code Online (Sandbox Code Playgroud)