考虑以下具有单个模板参数的模板函数:
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
,但我想它无论如何都会衰减。
答案 0 :(得分:2)
是的,这是一个函数指针比较,它确实有效。您不能编写&F
,因为模板参数与常规函数参数decays to a pointer类似,因此F
已经是指针(和prvalue)。