具有"templated"返回类型和参数的函数指针

Function pointer with "templated" return type and arguments

本文关键字:函数 指针 参数 templated 返回类型 具有      更新时间:2023-10-16

所以我想要一个函数来接收函数指针,具有"未知"返回类型和参数。该函数应返回与它作为参数接收的函数相同的类型。 我想过这样的事情,但它不起作用:

template<typename type, typename... param>
type do_sth(type (*func)(param... args))
{
// ...
type ret = func(std::forward<param>(args)...);
// ...
return ret;
}

我这样做是因为我必须在函数本身之前和之后执行一些其他函数。

这样的事情可能吗?使用定义(但没有返回值(绝对是可能的。但是因为它们不受命名空间的影响,所以我想使用一个函数。

使用定义语句,它看起来像这样(不返回任何内容(:

#define do_sth(x) /*...*/
x;
/*...*/

您需要分别传递函数和参数:

template<typename type, typename... param>
type do_sth(type (*func)(param...), param... args)

演示

请注意,如果这样做,您将在隐式转换时遇到一些麻烦。

您也可以直接按类型接受函数,但获取返回类型会更加复杂:

template<typename F, typename... param>
std::invoke_result_t<F, param...> do_sth(F func, param... args)

std::invoke_result是C++17(但在C++11中也有result_of(。使用此版本,隐式转换工作得很好。

演示