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

来自cppreference.com
<tbody> </tbody>
在标头 <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, ...),其中:
  • Rstd::result_of_t<Fn(ArgTypes...)>
  • T1, T2, ... 为定义于上的 INVOKE(std::declval<Fn>(), std::declval<ArgTypes>()...)调用形参

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

invocation_type<Fn(ArgTypes...)>::type R(U1, U2, ...),其中
  • Rstd::result_of_t<Fn(ArgTypes...)>
  • T1, T2, ... 为定义如上的 INVOKE(std::declval<Fn>(), std::declval<ArgTypes>()...)调用形参
  • A1, A2, ... 代表 ArgTypes...
  • std::declval<Ai>() 为右值则 Uistd::decay_t<Ai>,否则为 Ti

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

辅助类型

<tbody> </tbody>
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)

示例

参阅

反射 TSC++ 文档