考虑以下代码:
template < class A >
class XX {
public:
template <int (*CC)() >
int bla (){ return CC(); }
int stam() {return 0;}
int f() {
return bla<stam>();
}
};
int main()
{
XX<int> xx;
printf(" this is %d\n", xx.f());
return 0;
}
它失败了
test.cpp: In member function ‘int XX<A>::f() [with A = int]’:
test.cpp:14: instantiated from here
test.cpp:8: error: ‘int XX<A>::stam() [with A = int]’ cannot appear in a constant-expression**
想了想就明白了。stam
在模板实例化之前不存在,因此它没有函数地址。当模板被实例化时,实例在代码中的某处被解开,然后stam
得到一个地址。因此,地址在编译时不是常量(尽管有一些工作可能是 - 但不支持)。
那么我为什么要这样做。我可以使用函数指针或虚函数。实际上bla
,使用stam
(有stam1
和stam2
)称其为无数次,甚至是小的性能改进(例如不使用间接)都是受欢迎的。
当然也有解决方案: 创建bla1
和bla2
几乎相同。编写一个预处理器宏。我想知道是否有一个优雅的解决方案。