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 % j; };

// 函数对象类
struct divide
{
	int operator() (int denominator, int divisor)
	{
		return denominator / divisor;
	}
};

void main()
{

	// 更灵活的map
	map<char, function<int(int, int)>> binops;
	binops[‘+‘] = add;
	binops[‘-‘] = minus<int>();
	binops[‘*‘] = [](int i, int j){return i * j; };
	binops[‘/‘] = divide();
	binops[‘%‘] = mod;

	cout << binops[‘+‘](10, 5) << endl;
	cout << binops[‘-‘](10, 5) << endl;
	cout << binops[‘*‘](10, 5) << endl;
	cout << binops[‘/‘](10, 5) << endl;
	cout << binops[‘%‘](10, 5) << endl;

	system("pause");
}

上面代码同时简单介绍了“Lambda 表达式”,“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

C++11 std::bind用法

例子2:

std::bind的使用...std::bind更像是对一个已有的函数进行一次包装(装饰)

#include <iostream>
#include <functional>
#include <typeinfo>
#include <string>
using namespace std;

int add1(int i, int j, int k) {
    return i + j + k;
}

class Person {
public:
    Person (const char* name):m_strName(name) {}

    void sayHello(const char* name) const {
        std::cout << m_strName<< " say: hello " << name << std::endl;
    }

    int operator()(int i, int j, int k) const {
        return i + j + k;
    }

    static string getClassName()
    {
        return string("Person");
    }

private:
    string m_strName;
};

/*
 *
 */
int main(void) {

    // 绑定全局函数
    auto add2 = std::bind(add1, std::placeholders::_1, std::placeholders::_2, 10);
    // 函数add2 = 绑定add1函数,参数1不变,参数2不变,参数3固定为10.
    std::cout << typeid(add2).name() << std::endl;
    std::cout << "add2(1,2) = " << add2(1, 2) << std::endl;
    std::cout << "\n---------------------------" << std::endl;

    // 绑定成员函数
    Person man("std::function");
    auto sayHello = std::bind(&Person::sayHello, man/*调用者*/, std::placeholders::_1/*参数1*/);
    sayHello("Peter");

    auto sayHelloToPeter = std::bind(&Person::sayHello, man/*调用者*/, "Peter"/*固定参数1*/);
    sayHelloToPeter ();

    // 绑定静态成员函数
    auto getClassName= std::bind(&Person::getClassName);
    std::cout << getClassName() << std::endl;

    std::cout << "\n---------------------------" << std::endl;

    // 绑定operator函数
    auto add100 = std::bind(&Person::operator (), man, std::placeholders::_1, std::placeholders::_2, 100);
    std::cout << "add100(1, 2) = " << add100(1, 2) << std::endl;

    // 注意:无法使用std::bind()绑定一个重载函数
    system("pause");
    return 0;
}
时间: 2024-08-11 09:39:53

C++11 std::function用法(c++常问问题十七)的相关文章

C++ 11 std::function std::bind使用

cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); 2.0内的代码用的不是CC_CALLBACK_1而是menu_selector. CC_CALLBACK系列是3.

c++11——std::function和bind绑定器

c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值. 可调用对象 c++中的可调用对象存在以下几类: (1)函数指针 (2)具有operator()成员函数的类对象(仿函数) (3)可被转换为函数指针的类对象 (4)类成员(函数)指针 void func(void){ //.... } struct Foo{ void operator()(void){ //... } }; struct Bar{ using fr_t = vo

swift中Optional用法以及常问问题

很多同学问Optional中?和 !区别,弄清这个问题我们首先了解一下swift中Optional语法 Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使用变量之前不进行初始化就会报错: var stringValue : String  //error: variable 'stringValue' used before being initialized //let hashVal

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的代码:

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中的std::function

http://www.jellythink.com/archives/771 看看这段代码 先来看看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased; 这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊.std::function这是什

【转】C++11中的std::function

原文地址:http://www.jellythink.com/archives/771 看看这段代码 先来看看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased; 这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊.std::functi

C++11中function和bind的用法示例

环境Visual Studio 2012,具体代码如下 #include <iostream> #include <functional> #include <string> void PrintNumber(int num) { std::cout << num << std::endl; } struct Printer { void Print(std::string print_str) { std::cout << prin

C++11 学习笔记 std::function和bind绑定器

一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门.为了统一泛化函数对象,函数指针,引用函数,成员函数的指针的各种操作,让我们可以按更统一的方式写出更加泛化的代码,C++11推出了std::function. std::function是可调用对象的包装器.它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象.通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和