检测传递给函数模板函数参数的特定函数

Detecting specific function passed to function parameter of function template

本文关键字:函数 参数 函数模板 检测      更新时间:2023-10-16

考虑以下具有单个模板参数的模板函数:

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因为模板参数,就像常规函数参数一样,衰减到指针,所以F已经是一个指针(和一个 prvalue(。