std::result_of用法

标签: stdresult_of 用法 c++11 完整可运行代码 实例
286人阅读 评论(0) 收藏 举报
分类:

std::result_of用法

template <class Fn, class... ArgTypes>

class result_of<Fn(ArgTypes...)>


头文件:

<type_traits>


用于在编译的时候推导出一个可调用对象(函数,std::funciton或者重载了operator()操作的对象等)的返回值类型.主要用于模板编写中.

模板参数:
Fn
         可调用对象

ArgTypes...
         参数列表. 注意是类型(int , string等)
成员:
type

         可调用对象的返回类型.(主要用该成员来获得结果)

一个简单的实例:

#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

一个模板中应用的实例:

有一个vector<Person>,Person就是一个简单的结构体,包含name,age,city三个字段,想要编写一个Group_by函数,实现对这个vector<Person>按Person的某个字段分组.

因为字段未定,编写一个模板比较好.

思路是向Group_by传一个函数,让用户决定这个字段.分组比较简单,数据插入一个multimap<T,Person>返回即可,但是定义multimap中的T类型由用户传入的函数决定.于是这时候就可以用result_of来确定函数的返回值,即T的类型.

#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<algorithm>
#include <utility>
using namespace std;

struct Person
{
    string name;
    int age;
    string city;    
};

vector<Person> vt ={
    {"aa",20,"shanghai"},
    {"bb",25,"beijing"},
    {"cc",20,"nanjing"},
    {"dd",25,"nanjing"}
};

//Group_by函数
template<typename Fn>
multimap<typename result_of<Fn(Person)>::type, Person> GroupBy(const vector<Person>& vt,const Fn& keySelect)
{
	typedef typename result_of<Fn(Person)>::type key_type;
	multimap<key_type,Person> map;
        for_each(vt.begin(),vt.end(),
                    [&](const Person& p){
                    map.insert(make_pair(keySelect(p),p));
                    });
    return map;
}

int main()
{   
    //按年龄分组
    auto res = GroupBy(vt, [](const Person& p){ return p.age; });
    //按城市分组
    auto res1 = GroupBy(vt, [](const Person& p) { return p.city; });

    //打印结果
    cout << "----------group by age:---------------" << endl;
    for_each(res.begin(),res.end(),[](decltype(res)::value_type & p){
                    cout << p.second.name <<" " << p.second.city << "  " << p.second.age  << endl;
                    });
    cout << "----------group by city:---------------"<< endl;
    for_each(res1.begin(),res1.end(),[](decltype(res1)::value_type & p){
                    cout << p.second.name <<" " << p.second.city << "  " << p.second.age  << endl;
                    });
    return 0;
}
运行结果:


写在最后:

本例还可以不使用std::result_of的方法,通过尾置返回类型推导实现

查看评论

result_of学习

result_of是一个小但很有用的组件,可以帮助程序员确定一个调用表达式的返回类型,主要用于泛型编程和其他Boost库组件,它已被收入TR1。 result_of位于名字空间boost,为了使用r...
  • fengbangyue
  • fengbangyue
  • 2012-01-03 21:06:27
  • 3836

result_of,declval,decltype的用法

C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注。这次要讲的是:C++11如何通过获取函数模板的返回值类型来简化我们的程序。 在谈到简化之前,我...
  • fion45
  • fion45
  • 2013-09-18 10:18:48
  • 4687

一年成为Emacs高手(像神一样使用编辑器)

作者:陈斌(redguardtoo) 版本号:20140329 更新时间: 2014-03-29 Sat 原创时间: 2012-01-31 Tue 版权:本文采用以下协议进行授权,自由转载 - 非商用...
  • redguardtoo
  • redguardtoo
  • 2012-01-31 16:35:12
  • 504665

Windows系统版本判定那些事儿

本文并不是讨论Windows操作系统的版本来历和特点,也不是讨论为什么没有Win9,而是从程序员角度讨论下Windows获取系统版本的方法和遇到的一些问题。在Win8和Win10出来之后,在获取系统版...
  • magictong
  • magictong
  • 2014-11-03 23:16:54
  • 29251

分享一个C++11写的线程池

上一篇博客讲述了一些线程池的知识。但是C++11让线程变得更加简单,关于C++11线程方面的知识之前也有过介绍。今天就介绍一个使用C++11写的简单的一个线程池,thread pool.github地...
  • wangshubo1989
  • wangshubo1989
  • 2016-04-26 22:29:06
  • 9329

std::result_of

编译时类型推导它可以在编译的时候推导出一个函数表达式的返回值类型struct S { double operator()(char, int&); // 这个函数的返回类型是 double }...
  • Catelemmon
  • Catelemmon
  • 2018-04-10 17:34:19
  • 2

std::generate和std::generate_n

* Difference between std::generate and std::generate_n来自:http://blog.csdn.net/yunccll/archive/2009/0...
  • kamaliang
  • kamaliang
  • 2011-06-29 19:07:00
  • 2338

mysql数据库协议..分析【mysql protocol 】

Retrieved from "http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol"MySQL Client/Serve...
  • caisini_vc
  • caisini_vc
  • 2010-03-08 13:43:00
  • 8293

boost------result_of的使用(Boost程序库完全开发指南)读书笔记

1、简介 首先来看两个小的工具类result_of和ref,它们是本章其他库的基础。result_of使用了复杂的技巧来自动推导函数的返回值类型,ref可以包装对象的使用,在传递参数时消除对象拷贝的代...
  • zengraoli
  • zengraoli
  • 2013-07-31 08:39:21
  • 2593

C++ std::mem_fn使用示例

#include #include #include #include #include #include #include #include using namespace std...
  • zhangpiu
  • zhangpiu
  • 2016-09-13 11:52:04
  • 1424
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 498
    排名: 10万+
    最新评论