gpt4 book ai didi

c++ - 模板化函数指针作为模板参数

转载 作者:可可西里 更新时间:2023-11-01 15:06:19 24 4
gpt4 key购买 nike

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

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

最佳答案

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

无需手动输入两次即可获得函数指针的类型。

关于c++ - 模板化函数指针作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42513305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com