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

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)。

10-02 01:50