繁体   English   中英

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

[英]templated function pointer as template parameter

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

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的指针)? 如果那不可能,为什么不呢?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM