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

时间:2017-02-28 15:55:04

标签: 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
}

此代码可以正常工作(http://cpp.sh/如果您想尝试),但是由于我将函数指针作为模板参数,我不需要_returnType,它就在函数签名中问题是,无论我怎么努力,我都无法找到摆脱这个额外模板参数的方法。

如何让aliasGetter只接受一个模板参数(指向getter to alias的指针)? 如果那不可能,为什么不呢?

1 个答案:

答案 0 :(得分:16)

在C ++ 17中,由于template auto

,它将成为可能
template <auto F> std::invoke_result_t<F> aliasGetter() { return F(); }

在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)>();

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