专门用于"direct"函数类型(与函数指针类型相对)

specializing for "direct" function types (as opposed to function-pointer types)

本文关键字:类型 函数 指针 相对 direct 用于      更新时间:2023-10-16

函数类型和函数指针类型之间存在差异(出于历史原因AFAIK(,前者在某些情况下会自动转换为后者。

typedef void (TFoo)(); // a function type
typedef void (*TBar)(); // a function POINTER type

可以使用模板来推断函数指针的返回类型和参数类型。例如:

template <typename T>
struct SFunctionInfo;
template <typename R, typename ... P>
struct SFunctionInfo<R (*)(P ...)>
{
using TReturn = R;
// You could also store the params in a custom type like:
// using TParams = SSomeVariadicTemplateStruct<P ...>;
};
template <typename T>
using TFunctionReturn = typename SFunctionInfo<T>::TReturn;
// ...
using TBarReturn = TFunctionReturn<TBar>;

Q1:非指针函数类型是否可能相同?我无法弄清楚语法。正在尝试:

template <typename T>
struct SFunctionInfo;
template <typename R, typename ... P>
struct SFunctionInfo<R ()(P ...)>
{ /* ... */ };

失败(通过 g++(:

error: ‘type name’ declared as function returning a function

尽管您可以使用R (&)(P ...)(和&&(来匹配函数引用类型。

而且typedef不适用于模板。


Q2(相关,可能会解决Q1(:是否有语法允许模板非指针函数类型的别名声明,类似于:

template <typename R, typename ... P>
using TFunction = R (*)(P ...);
Q3(

相关,可以解决Q1(:是否可以将函数指针类型转换为函数类型(反之亦然(,而无需检测返回和参数并重建所述类型?

Q2

template <typename R, typename ... P>
using TFunction = R(P ...);

问1:

使用 Q2 中的语法:

template <typename R, typename ... P>
struct SFunctionInfo<R(P...)>
{};

问3:

除了常规指针引用/取消引用之外,无需执行任何不同操作。(我只是搞砸了测试它(。

  • 函数类型 -> 函数指针类型:只需添加 *
  • 函数指针类型 -> 函数类型:为 T* 专门化一个结构(或者只使用 std::remove_pointer,正如 PasserBy 上面所说(