模板化函数指针作为模板参数

Nya*_*hes 11 c++ templates c++14

我偶然发现了一个在处理模板时遇到麻烦的小问题.这是一个例子:

template<class _returnType, _returnType (*_function)()>
_returnType aliasGetter() { return _function(); }
int getCoolNumber() { return 42; }
int main()
{ 
    std::cout << aliasGetter<int, &getCoolNumber>(); //42
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效(http://cpp.sh/如果你想尝试一下),但是因为我给一个函数指针作为模板参数我不需要_returnType,它就在函数签名中,问题是,没有无论我怎么努力,我都找不到摆脱这个额外模板参数的方法.

如何aliasGetter只使用一个模板参数(指向getter的别名指针)?如果那不可能,为什么不呢?

Bar*_*rry 16

在C++ 17中,由于以下原因,它将成为可能template auto:

template <auto F> std::invoke_result_t<F> aliasGetter() { return F(); }
Run Code Online (Sandbox Code Playgroud)

在C++ 17之前,它是不可能的.您需要指定非类型模板参数的类型 - 没有办法解决这个问题.您不能为此创建工厂,因为您无法通过函数模板传递函数指针并使其最终成为非类型模板参数.


C++ 14中最短的解决方法是叹息,使用宏:

template <class T, T F> std::result_of_t<T()> aliasGetter() { return F(); }
#define TEMP_ALIAS(x) decltype(x), x

std::cout << aliasGetter<TEMP_ALIAS(&getCoolNumber)>();
Run Code Online (Sandbox Code Playgroud)

它可以为您提供函数指针的类型,而无需手动输入两次.