C++11 function用法 可调用对象模板类

std::function<datatype()>

()内写参数类型

datatype 代表function的返回值

灵活的用法..

代码如下

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <map>
 4 #include <functional>
 5 #include <stdlib.h>
 6 using namespace std;
 7
 8 // 普通函数
 9 int add(int i, int j) { return i + j; }
10 // lambda表达式
11 auto mod = [](int i, int j){return i % j; };
12 // 函数对象类
13 struct divide
14 {
15     int operator() (int denominator, int divisor)
16     {
17         return denominator / divisor;
18     }
19 };
20
21 ///////////////////////////SubMain//////////////////////////////////
22 int main(int argc, char *argv[])
23 {
24     // 受限的map
25     map<char, int(*)(int, int)> binops_limit;
26     binops_limit.insert({ ‘+‘, add });
27     binops_limit.insert({ ‘%‘, mod });
28     // 错误    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> &&”
29     // binops_limit.insert({ ‘%‘, divide() });
30     cout<<"limit: "<<binops_limit[‘+‘](10, 5)<<endl;
31     cout<<"limit: "<<binops_limit[‘%‘](10, 5)<<endl;
32     // 更灵活的map
33     map<char, function<int(int, int)>> binops =
34     {
35         { ‘+‘, add },
36         { ‘-‘, minus<int>() },
37         { ‘*‘, [](int i, int j){return i * j; } },
38         { ‘/‘, divide() },
39         { ‘%‘, mod },
40     };
41     cout << binops[‘+‘](10, 5) << endl;
42     cout << binops[‘-‘](10, 5) << endl;
43     cout << binops[‘*‘](10, 5) << endl;
44     cout << binops[‘/‘](10, 5) << endl;
45     cout << binops[‘%‘](10, 5) << endl;
46     system("pause");
47     return 0;
48 }

demo

时间: 2024-10-19 03:55:43

C++11 function用法 可调用对象模板类的相关文章

C/C++: C++可调用对象详解

C++中有几种可调用对象:函数,函数指针,lambda表达式,bind创建的对象,以及重载了函数调用符的类. 1. 函数 函数基础的东西(形参,实参,返回,参数传递,声明,递归...)这些,不再叙述,都是基础得不能再基础的东西了.局部对象,有了CSAPP的基础这些都不是问题,重点讲下C++11的某些重要特性和函数指针. 关于可变形参函数 C++11有两种办法传递可变形参(其实学了模板以后可以用模板的自动递归来展开所传递的参数,这个后面再说). 第一种是initializer_list,这是一个标

C++ 模板类的实现为何放在.h中

主要原因:C++标准明确表示,当一个模板不被用到的时侯它就不该被实例化出来: 如以下代码:main.cpp中调用到模板类A的方法A<int>::f,因A<int>::f在test.cpp中实现,编译器在#1处并不知道A<int>::f的定义,故寄希望于连接器,实际上test.cpp编译出来的test.obj文件中关于A::f一行二进制代码也没有,因为模板类A在test.cpp未被实例化,此时连接器就会报错.所以,必须把模板类的实现放在.h中,此时main.cpp中调用A

编程算法 - 求1+2+...+n(模板类) 代码(C++)

求1+2+...+n(模板类) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\while\if\else\switch\case等关键字及条件判断语句(A?B:C). 可以使用模板类求解, 输入模板参数, 进行递归调用, 每次递归值减1, 至模板参数为1时, 显示调用结束模板类. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author

C++11 function函数用法

// C++11 function #include <functional> void print_num(int i) { std::cout << i << '\n'; } void testFunctionTpl() { // templet 匿名函数 std::function<void(const int&, const int&)>getSum = [&](const int &nI1, const int &a

C++11 std::function用法(c++常问问题十七)

C++11 std::function用法 直接上代码: 例子1:std::function的感觉就像是函数指针那样有木有 #include <iostream> #include <functional> #include <map> using namespace std; // 普通函数 int add(int i, int j) { return i + j; } //lambda表达式 auto mod = [](int i, int j){return i

C++11模板类使用心得

1.推荐使用std::shared_ptr<TaskT>代替指针TaskT*使用,shared_ptr是一种智能指针,能自主销毁释放内存,在c++11中被引入,在多线程编程中有很大的用处,它可以统计有多少指针指向同一个对象.该类被包含在<memory>中. 2.在模板类中要使用某一容器的iterator类型,需要在该iterator类型前加上typename,才能进行编译,原因不明. 3.容器中的iterator类型只要不被删除,iterator所指向的内容是恒定的,利用这一点可以

Oracle自定义数据类型 2 (调用对象方法)

调用对象方法 调用对象方法基于类型创建表后,就可以在查询中调用对象方法 A. 创建基于对象的表语法: create   table   <表名>   of   <对象类型>意义:此表具有该类型和member方法的所有属性, 我们不能通过DBA   STUDIO的表数据编辑器来编辑数据. 例:create   table   FLIGHT_SCH_TAB   of   FLIGHT_SCH_TYPE insert   into   FLIGHT_SCH_TAB     values(

C++ 11可变参数接口设计在模板编程中应用的一点点总结

概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量(或属性,C#中属性和成员变量还是有区别的): 类的成员方法: 从编译器的角度看,我们必须明确指定以上3部分,才算完整地定义了一个类并且编译通过. 所谓的“类弱化”,是指类的设计者在定义类的时候,并没有完整定义一个类,而是把类的其中一部分的定义留给类的使用者. 从传统才c++98看,通过模板类,使用

C++11新特性之五——可变参数模板

有些时候,我们定义一个函数,可能这个函数需要支持可变长参数,也就是说调用者可以传入任意个数的参数.比如C函数printf(). 我们可以这么调用. printf("name: %s, number: %d", "Obama", 1); 那么这个函数是怎么实现的呢?其实C语言支持可变长参数的. 我们举个例子, double Sum(int count, ...) { va_list ap; double sum = 0; va_start(ap, count); fo