根据模板参数值键入

时间:2016-08-08 13:40:01

标签: c++ c++11 visual-c++

我目前有一个类似的模板函数:

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;

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

注意:func1func2func3已修复且无法控制。

谢谢!

2 个答案:

答案 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