c++ - 作为非类型参数的局部变量,具有模板规范

标签 c++ templates template-specialization

我有一个模板函数,以及一个枚举模板规范。我希望程序在运行时根据枚举的值选择模板规范。可能吗?

以下代码出错:

error C2971: 'Func' : template parameter 'fruit' : 'fruit' : a local variable cannot be used as a non-type argument

代码:

enum class Fruit
{
    Apple,
    Orange,
    Count
};

template<Fruit>
void Func()
{}

template<>
void Func<Fruit::Apple>()
{
    std::cout << "Apple" << std::endl;
}

template<>
void Func<Fruit::Orange>()
{
    std::cout << "Orangle" << std::endl;
}

void Foo(Fruit fruit)
{
    Func<fruit>(); // error C2971: 'Func' : template parameter 'fruit' : 'fruit' : a local variable cannot be used as a non-type argument
}

int _tmain(int argc, _TCHAR* argv[])
{
    Foo(Fruit::Apple);
    return 0;
}

最佳答案

I want the program to choose the template specification based on the value of enum at runtime.

不,那是不可能的。模板非类型参数必须在编译时可用。如果直到运行时你才知道你的值,你只能将它作为函数参数传递。

正如 TC 所建议的,您可以做的是切换所有可能的值,并使用编译时常量显式调用Func文字:

void Foo(Fruit fruit)
{
    switch (fruit) {
    case Fruit::Apple:
        Func<Fruit::Apple>();
        break;
    case Fruit::Orange:
        Func<Fruit::Orange>();
        break;
    // .. maybe other fruits here
    }
}

关于c++ - 作为非类型参数的局部变量,具有模板规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27914841/

相关文章:

c++ - boost::detail::addr_impl_ref 的目的是什么?

c++ - 如何专门化 std::begin?

c++ - 仅专门化模板类的一个方法(的一部分)

c++ - "if (getline(fin, str)) {}"是否符合C++11标准?

c++ - 在 C++ 中获取属于另一个具有多重继承的类的类的指针

javascript - Python Flask 模板使用 {{}} 不能混合 javascript var

c++ - 引用模板参数的用途

c++ - 是否可以将模板的所有实例化类声明为相互友元?

c++ - Qt Sqlite 表列似乎不见了

c++ - 是否需要实现来诊断对同一TU中相同显式专业的重复定义进行ODR违规?