<type_traits>

类模板
<type_traits>

std::result_of

template <class Fn, class... ArgTypes> struct result_of<Fn(ArgTypes...)>;
调用结果
获取对某个调用的*结果类型*Fn参数类型列表为ArgTypes.

结果类型被别名为成员类型result_of::type并在以下任一情况定义

  • 如果 Fn 是一个*函数*或函数对象类型,并且接收 ArgTypes 作为参数。
  • 如果 Fn 是一个*非静态成员函数的指针*,并且 ArgTypes 中的第一个类型是该成员所属的类(或其引用、或其派生类型的引用、或其指针),而 ArgTypes 中的其余类型描述了它的参数。
  • 如果 Fn 是一个*非静态数据成员的指针*,并且 ArgTypes 是一个与该成员所属类匹配的单一类型(或其引用、或其派生类型的引用、或其指针)。在这种情况下,成员 type 是该数据成员的类型。
在所有其他情况下,成员 type 未定义。

模板参数

Fn
一个*可调用类型*(即函数对象类型或成员指针),或函数的引用,或可调用类型的引用。
ArgTypes...
类型列表,顺序与调用中的一致。
请注意,模板参数不是用逗号分隔的,而是以函数形式给出。

成员类型

成员类型定义
类型的调用结果类型Fn具有类型参数列表的ArgTypes.

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// result_of example
#include <iostream>
#include <type_traits>

int fn(int) {return int();}                            // function
typedef int(&fn_ref)(int);                             // function reference
typedef int(*fn_ptr)(int);                             // function pointer
struct fn_class { int operator()(int i){return i;} };  // function-like class

int main() {
  typedef std::result_of<decltype(fn)&(int)>::type A;  // int
  typedef std::result_of<fn_ref(int)>::type B;         // int
  typedef std::result_of<fn_ptr(int)>::type C;         // int
  typedef std::result_of<fn_class(int)>::type D;       // int

  std::cout << std::boolalpha;
  std::cout << "typedefs of int:" << std::endl;

  std::cout << "A: " << std::is_same<int,A>::value << std::endl;
  std::cout << "B: " << std::is_same<int,B>::value << std::endl;
  std::cout << "C: " << std::is_same<int,C>::value << std::endl;
  std::cout << "D: " << std::is_same<int,D>::value << std::endl;

  return 0;
}

输出
typedefs of int:
A: true
B: true
C: true
D: true


另见