std::experimental::invocation_type, std::experimental::raw_invocation_type

来自cppreference.com
在标头 <experimental/type_traits> 定义
template< class >

struct raw_invocation_type; // 未定义

template< class Fn, class... ArgTypes >

struct raw_invocation_type<Fn(ArgTypes...)>;
(1) (库基础 TS)
template< class >

struct invocation_type; // 未定义

template< class Fn, class... ArgTypes >

struct invocation_type<Fn(ArgTypes...)>;
(2) (库基础 TS)

在以实参 ArgTypes... 调用 Fn,如在 INVOKE(std::declval<Fn>(), std::declval<ArgTypes>()...) 中时计算调用形参,其中 INVOKE可调用 (Callable) 中定义的操作。

表达式 INVOKE(f, t1, t2, ..., tN)调用形参定义如下,其中 T1 是(可有 cv 限定的) t1 的类型,而若 t1 为左值则 U1T1&,否则为 T1&&

  • f 是指向类 T 成员函数的指针,则调用形参是 U1 后随 t2, ..., tN 所匹配的 f 的形参。
  • N == 1f 为指向类 T 数据成员的指针,则调用形参为 U1
  • f 为类类型对象,则调用形参为在 f 的代理调用函数和函数调用运算符间,实参 t1, ..., tN 的最佳可达函数的匹配 t1, ..., tN 的形参。
  • 所有其他情况下,调用形参是匹配 t1, ..., tNf 的形参。

若实参 tI 匹配函数形参列表中的省略号,则对应的调用形参是对 tI 应用默认实参提升的结果。

FnArgTypes 中的所有类型能为完整类型、未知边界数组或(可有 cv 限定的)void

成员类型

成员类型 定义
raw_invocation_type<Fn(ArgTypes...)>::type R(T1, T2, ...),其中:

仅若能在不求值语境中以 ArgTypes... 调用 Fn 才定义。

invocation_type<Fn(ArgTypes...)>::type R(U1, U2, ...),其中

仅若能在不求值语境中以 ArgTypes... 调用 Fn 才定义。

辅助类型

template< class T >
using raw_invocation_type_t = typename raw_invocation_type<T>::type;
(库基础 TS)
template< class T >
using invocation_type_t = typename invocation_type<T>::type;
(库基础 TS)

示例

参阅