std::function

来源:互联网 发布:2015年出境游数据 编辑:程序博客网 时间:2024/05/22 06:19

       std::function可以将普通函数,lambda表达式和函数对象类统一起来。它们并不是相同的类型,然而通过function模板类,可以转化为相同类型的对象(function对象),从而放入一个map里。

<pre class="cpp" name="code">#include "stdafx.h"#include <iostream>#include <map>#include <functional>using namespace std;// 普通函数int add(int i, int j) { return i + j; }// lambda表达式auto mod = [](int i, int j){return i % j; };// 函数对象类struct divide{    int operator() (int denominator, int divisor)    {        return denominator / divisor;    }}; int _tmain(int argc, _TCHAR* argv[]){    // 受限的map    map<char, int(*)(int, int)> binops_limit;    binops_limit.insert({ '+', add });    binops_limit.insert({ '%', mod });    // 错误  1   error C2664: “void std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::insert(std::initializer_list<std::pair<const _Kty,_Ty>>)”: 无法将参数 1 从“initializer-list”转换为“std::pair<const _Kty,_Ty> &&”    // binops_limit.insert({ '%', divide() });     // binops_limit.insert({ '-', minus<int>() });// 更灵活的map    map<char, function<int(int, int)>> binops =     {        { '+', add },        { '-', minus<int>() },        { '*', [](int i, int j){return i*j; } },       { '/', divide() },        { '%', mod },    };    cout << binops['+'](10, 5) << endl;    cout << binops['-'](10, 5) << endl;    cout << binops['*'](10, 5) << endl;    cout << binops['/'](10, 5) << endl;    cout << binops['%'](9, 5) << endl;    system("pause");    return 0;}

如上所示,function可以将普通函数,lambda表达式和函数对象类统一起来。它们并不是相同的类型,然而通过function模板类,可以转化为相同类型的对象(function对象),从而放入一个map里。
                                             
0 0
原创粉丝点击