函数指针的自动模板推导

Bub*_*aya 1 c++ templates function-pointers

在下面的代码中

template<class T> void f(T);
int main(){
    f(3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

像往常一样,模板参数intfor 会自动推导。

但在

template<class T> void f(T);
template<class T> void (*p)(T) = f<T>;

int main(){
    p(3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器(clang++)坚持认为p(3)需要模板参数。为什么?

此外,如果我将该行放在template<class T> void (*p)(T) = f<T>;标头中以供多个文件包含,会导致问题吗?

Ale*_*lex 5

模板参数推导适用于 C++17 中的函数模板和 CTAD。对于您的示例来说,编写包装器很简单。

template<class T> void f(T);
template<class T> void (*p)(T) = f<T>;


template<typename T> void Wrapper(T&& t)
{
    p<T>(std::forward<T>(t));
}

int main(){
    Wrapper(3);
}
Run Code Online (Sandbox Code Playgroud)