C++11 function (2017-05-05 第2次修改)

CalmReason發表於2016-03-31

function+bind可以實現按值傳遞函式物件

從而而消滅多型(無需繼承基類即可實現一般意義上的多型)

本質上是物件訊息機制,可以向任何物件傳遞訊息並執行,只需要規定訊息的格式,這個格式就是函式物件的宣告。

本文示例程式碼:參考《C++ Primer 第五版中文版》 

思想參考:《Linux 多執行緒服務端程式設計》以及 孟巖的 function/bind的救贖(上)

另見:面向介面程式設計

程式碼:

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

int add(int i,int j) { return i+j;}

class divide
{
public:
	int operator()(int i,int j){return i/j;}
};

class Big
{
public:
	bool bigger_than(int i,int j){return i>j;}
};
int main(int, char *[])
{
	int i=10,j=5;

	auto mod = [](int i,int j){return i%j;};
	typedef function<int(int,int)> fun;
	map<string,function<int(int,int)>> binary_operators ;
	
	binary_operators.insert(make_pair<string,fun>("+",add));//函式指標
	binary_operators.insert(make_pair<string,fun>("-",std::minus<int>()));//函式物件
	binary_operators.insert(make_pair<string,fun>("/",divide()));//使用者定義的函式物件
	binary_operators.insert(make_pair<string,fun>("*",[](int i,int j){return i*j;}));//未命名的lambda
	binary_operators.insert(make_pair<string,fun>("%",mod));//命了名的lambda
	Big big;
	fun f = std::bind(&Big::bigger_than,big,i,j);//呼叫big.bigger_than(i,j)
	binary_operators.insert(make_pair<string,fun>(">",f));//任意類的成員函式

	cout<<i<<"+"<<j<<"="<<binary_operators["+"](i,j)<<endl;
	cout<<i<<"-"<<j<<"="<<binary_operators["-"](i,j)<<endl;
	cout<<i<<"/"<<j<<"="<<binary_operators["/"](i,j)<<endl;
	cout<<i<<"*"<<j<<"="<<binary_operators["*"](i,j)<<endl;
	cout<<i<<"%"<<j<<"="<<binary_operators["%"](i,j)<<endl;
	cout<<i<<">"<<j<<"="<<binary_operators[">"](i,j)<<endl;
	return 0;
};
輸出:

10+5=15
10-5=5
10/5=2
10*5=50
10%5=0
10>5=1
請按任意鍵繼續. . .




相關文章