首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >局部变量作为非类型参数,带有模板规范。

局部变量作为非类型参数,带有模板规范。
EN

Stack Overflow用户
提问于 2015-01-13 04:22:13
回答 1查看 1.3K关注 0票数 0

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

以下代码出错:

代码语言:javascript
复制
error C2971: 'Func' : template parameter 'fruit' : 'fruit' : a local variable cannot be used as a non-type argument

代码:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-13 04:24:02

我希望程序基于运行时枚举的值来选择模板规范。

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

正如TC建议的那样,您可以做的是对所有可能的值进行switch,并使用编译时常量文本显式调用Func

代码语言:javascript
复制
void Foo(Fruit fruit)
{
    switch (fruit) {
    case Fruit::Apple:
        Func<Fruit::Apple>();
        break;
    case Fruit::Orange:
        Func<Fruit::Orange>();
        break;
    // .. maybe other fruits here
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27914841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档