C++11 function

#include <iostream>
#include <functional>
#include <vector>
using namespace std;

// c type global function
int c_func(int a, int b)
{
    return a + b;
}

//function object
class functor
{
public:
    int operator() (int a, int b)
    {
        return a + b;
    }
};

int main()
{
    //old use way
    typedef int (*F)(int, int);
    F f = c_func;
    cout<<f(1,2)<<endl;

    functor ft;
    cout<<ft(1,2)<<endl;

    /////////////////////////////////////////////

    std::function< int (int, int) > myfunc;

    myfunc = c_func;
    cout<<myfunc(3,4)<<endl;

    myfunc = ft;
    cout<<myfunc(3,4)<<endl;

    //lambda
    myfunc = [](int a, int b) { return a + b;};
    cout<<myfunc(3, 4)<<endl;

    //////////////////////////////////////////////

    std::vector<std::function<int (int, int)> > v;
    v.push_back(c_func);
    v.push_back(ft);
    v.push_back([](int a, int b) { return a + b;});

    for (const auto& e : v)
    {
        cout<<e(10, 10)<<endl;
    }

    return 0;
}

C++中,可调用实体主要包括函数,函数指针,函数引用,可以隐式转换为函数指定的对象,或者实现了opetator()的对象(即C++98中的functor)。C++11中,新增加了一个std::function对象,std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的).

  • (1)关于可调用实体转换为std::function对象需要遵守以下两条原则:
           a. 转换后的std::function对象的参数能转换为可调用实体的参数
           b. 可调用实体的返回值能转换为std::function对象的返回值(这里注意,所有的可调用实体的返回值都与返回void的std::function对象的返回值兼容)。
  • (2)std::function对象可以refer to满足(1)中条件的任意可调用实体
  • (3)std::function object最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等.
时间: 2024-08-02 21:36:05

C++11 function的相关文章

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 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

c++11:function的用法

function是函数.函数对象.函数指针.和成员函数的包装器,可以容纳任何类型的函数对象,函数指针,引用函数,成员函数的指针 普通函数 #include <functional> void print_num(int i) { cout << "i" << endl; } function<void(int)> f_display = print_num; f_display(-9); function<void()> f_

c++11特性与cocos2d-x 3.0之std::bind与std::function

昨天同事让帮忙写一小功能,才发现cocos2d-x 3.0 和 cocos2d-x 3.0rc0 差别还是相当大的. 发现Label这一个控件,3.0就比rc0版本多了一个创建函数,更为关键的是3.0内的Label锚点是在ccp(0.5,0.5),而一直3.0rc0是ccp(0,0). 累觉不爱.尽管cocos2d-x改变太快,兼容性一次次的暴露出不足,但是,总归是向好的方向进行.于是下载了3.0来玩玩~ cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码:

0801-----C++Primer听课笔记----------C++11新特性 function 和 bind 的简单使用

1.function 和 函数指针 1.1 function有函数指针的功能,但是使用起来明显比函数指针更加灵活和方便. 1.2 函数指针和function的用法实例. 1.2.1 函数指针首先要清楚函数指针的类型,如void (*)(int, char)等,然后声明一函数指针变量直接调用即可. #include <iostream> using namespace std; /* * 函数指针的用法 */ void test(int i,double j){ cout << i

从var func=function 和 function func()区别谈Javascript的预解析机制

var func=function 和 function func()在意义上没有任何不同,但其解释优先级不同:后者会先于同一语句级的其他语句. 即: { var k = xx(); function xx(){return 5;} } 不会出错,而 { var k = xx(); var xx = function(){return 5;} } 则会出错. 为什么会这样呢?这就要引出javascript中的预解析机制来解释了. JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个

springMVC学习(11)-json数据交互和RESTful支持

一.json数据交互: json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservice接口,传输json数据. springMVC进行json交互 1)环境准备: 加载json转换的jar包: springmvc中使用jackson的包进行json转换(@requestBody和@responseBody使用下边的包进行json转) jackson-core-asl-1.9.11.jar jackson-mapper-asl-1.9.11.

2016/07/11 PHP接口的介绍与实现

接口定义了实现某种服务的一般规范,声明了所需的函数和常量,但不指定如何实现.之所以不给出实现的细节,是因为不同的实体可能需要用不同的方式来实现公共的方法定义.关键是要建立必须实现的一组一般原则,只有满足了这些原则才能说实现了这个接口. 接口中不定义类成员!类成员的定义完全交给实现类来完成. 先来看一个简单的例子,有个全面的认识: 01 <?php 02 interface Fruit 03 { 04     const MAX_WEIGHT = 5;   //此处不用声明,就是一个静态常量 05

prototype 和function关系等总结

js提供了一些内置类,如Array String Function等,只要有类就有原型. 1,function ,属性包括 arguments, caller,length,name ,prototype,__proto__, 2,prototype,属性又分为constructor: function () {},__proto__: Object, 3,__proto__从别的原型链继承过来可以直接用的,prototype是要加在自己原型链上的,供别人调用,或者直接实例化后,别人可以直接调用