考虑以下具有单个模板参数的模板函数:
typedef void (func_t)();
void defaultF() {}
template <func_t F = defaultF>
void foo() {
F();
}
现在在
foo()
中,我想确定F是否是defaultF
的默认参数。直接进行地址比较1:
template <func_t F = defaultF>
void foo() {
if (F == defaultF) {
cout << "DefaultF";
} else {
cout << "Something else...";
}
cout << endl;
}
似乎可以在我尝试过的编译器上工作,但是可以保证它是有效的技术吗?
1至少我认为这等同于函数地址比较:我实际上无法编写
&F
,但我想它还是会衰减。 最佳答案
是的,那是一个函数指针比较,它确实起作用。您无法编写&F
,因为模板参数就像常规函数参数decays to a pointer一样,因此F
已经是一个指针(和prvalue)。