【发布时间】:2011-08-20 19:05:07
【问题描述】:
我在一个类中有以下(部分)代码,我尝试通过 C++11 中的元编程根据值列表评估一个值。
bool eval(GLenum value)
{
return false;
};
template<GLenum One, GLenum... Others>
bool eval(GLenum value)
{
if( value == One )
return true;
// Try out the rest
return eval<Others...>(value);
};
gcc 抱怨:
../emul/GLPart.h:在成员函数'bool GLPart::eval(GLenum) [with unsigned int One = 519u, 无符号整数 ...其他 = {},无符号整数 ...ValidEnums = {512u,513u, 514u、515u、516u、517u、518u、519u},GLenum = unsigned int]’: ../emul/GLPart.h:26:31:从“bool”实例化 GLPart::eval(GLenum) [with unsigned int One = 518u, 无符号整数 ...其他 = {519u},无符号整数 ...ValidEnums = {512u, 513u, 514u, 515u, 516u, 517u, 518u, 519u}, GLenum = unsigned int]’ ../emul/GLPart.h:26:31:从“bool”实例化 GLPart::eval(GLenum) [with unsigned int One = 517u, 无符号整数 ...其他 = {518u, 519u},无符号整数 ...ValidEnums = {512u, 513u, 514u, 515u, 516u, 517u, 518u, 519u}, GLenum = 无符号 int]' ../emul/GLPart.h:26:31: 从'bool 实例化 GLPart::eval(GLenum) [with unsigned int One = 516u, unsigned int ...其他 = {517u, 518u, 519u}, unsigned int ...ValidEnums = {512u, 513u, 514u, 515u, 516u, 517u, 518u, 519u}, GLenum = unsigned int]' ../emul/GLPart.h:26:31: 实例化自 'bool GLPart::eval(GLenum) [with unsigned int One = 515u, unsigned int ...其他 = {516u, 517u, 518u, 519u}, unsigned int ...ValidEnums = {512u, 513u, 514u, 515u, 516u, 517u, 518u, 519u}, GLenum = unsigned int]' ../emul/GLPart.h:26:31: 实例化自 'bool GLPart::eval(GLenum) [with unsigned int One = 514u, unsigned int ...其他 = {515u, 516u, 517u, 518u, 519u}, unsigned int ...ValidEnums = {512u, 513u, 514u, 515u, 516u, 517u, 518u, 519u}, GLenum = unsigned int]' ../emul/GLPart.h:26:31: 实例化自 'bool GLPart::eval(GLenum) [with unsigned int One = 513u, 无符号整数 ...其他 = {514u, 515u, 516u, 517u, 518u, 519u}, 无符号整数 ...ValidEnums = {512u, 513u, 514u, 515u, 516u, 517u, 518u, 519u}, GLenum = unsigned int]' ../emul/GLPart.h:26:31:
从'bool GLPart::eval(GLenum) [with unsigned int 一 = 512u, unsigned int ...其他 = {513u, 514u, 515u, 516u, 517u, 518u, 519u}, 无符号整数 ...ValidEnums = {512u, 513u, 514u, 515u, 516u, 517u, 518u, 519u}, GLenum = unsigned int]’ ../emul/GLPart.h:31:43:从“bool”实例化 GLPart::Evaluate(GLenum) [with unsigned int ...ValidEnums = {512u, 513u, 514u, 515u, 516u, 517u, 518u, 519u}, GLenum = 无符号 int]' alpha.cpp:8:7: 从这里实例化 ../emul/GLPart.h:26:31: 错误:没有匹配函数调用‘GLPart::eval(GLenum&)'
因此,当 One 有值而 Others 没有值时,它似乎在最后一次递归中窒息。在这种情况下,模板参数应该为空。我需要以另一种方式声明普通的 eval 吗?有一段时间没有编写 C++ 代码了,所以它可能是微不足道的,但我就是不明白;)
当尝试将 template 添加到第一个 eval 时,它会窒息:
../emul/GLPart.h:14:11:错误:显式特化 非命名空间范围'class GLPart' ../emul/GLPart.h:21:7: 错误:模板参数列表太多 ../emul/GLPart.h:在成员中 函数‘bool GLPart::Evaluate(GLenum)’: ../emul/GLPart.h:32:23:错误:参数包未扩展 '...':../emul/GLPart.h:32:23:注意:'ValidEnums' ../emul/GLPart.h:32:33:错误:在“...”标记之前应为“,”或“;”
解决方案:
template<GLenum One>
bool eval(GLenum value)
{
return value == One;
};
template<GLenum One, GLenum Two, GLenum... Others>
bool eval(GLenum value)
{
if( eval<One>(value) )
return true;
// Try out the rest
return eval<Two, Others...>(value);
};
【问题讨论】:
-
第一个函数不是模板,所以永远不能这样调用
eval<Others...>(value);。 -
尝试并确实造成了另一个错误...
标签: c++ templates c++11 metaprogramming