基于模板参数值的类型

Type based on template argument value

本文关键字:类型 参数 于模板      更新时间:2023-10-16

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

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是固定的,我无法控制。

谢谢!

作为的替代品

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, .....);
}

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