c++ - 基于模板参数值的类型

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

谢谢!

最佳答案

作为替代

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/

相关文章:

c++ - 堆分配的成员引用是一个糟糕的主意吗?为什么?

C++11 的 shared_ptr 赋值

c++ - const 引用作为返回值如何在 C++ 中工作

c++ - 创建对话框时更改对话框的标题

visual-c++ - MFC AfxParseURL反向函数?

C++ vector 被覆盖

java - Java 中的字符串终止符

c++ - load-acquire 应该立即看到 store-release 吗?

c++ - 实例如何将自身添加到 vector 中?

c++ - vptr 是否曾经位于对象的开头?