1, 包裝器function
std::function模板類是一個(gè)通用的可調(diào)用對象的包裝器,用簡單的、統(tǒng)一的方式處理可調(diào)用對象。
#include <iostream>
#include <functional>
using namespace std;
// 普通函數(shù)
void show(int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
}
struct AA // 類中有靜態(tài)成員函數(shù)。
{
static void show(int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
}
};
struct BB // 仿函數(shù)。
{
void operator()(int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
}
};
struct CC // 類中有普通成員函數(shù)。
{
void show(int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
}
};
struct DD // 可以被轉(zhuǎn)換為普通函數(shù)指針的類。
{
using Fun = void (*)(int, const string&); // 函數(shù)指針的別名。
operator Fun() {
return show; // 返回普通函數(shù)show的地址。
}
};
int main() {
// 普通函數(shù)
using Fun = void(int, const string&); // 函數(shù)類型的別名。
void(*fp1)(int, const string&) = show; // 聲明函數(shù)指針,指向函數(shù)對象。
fp1(1, "我是一只傻鳥"); // 用函數(shù)指針調(diào)用普通函數(shù)。
function<void(int, const string&)> fn1 = show; // 包裝普通全局函數(shù)show。
fn1(1, "我是一個(gè)傻鳥"); // 用function對象調(diào)用普通全局函數(shù)show
// 類的靜態(tài)成員函數(shù)
void(*fp2)(int, const string&) = AA::show; // 用函數(shù)指針指向類的靜態(tài)成員函數(shù)
fp2(2, "我是一只傻鳥");
function<void(int, const string&)> fn2 = AA::show; // 包裝類的靜態(tài)成員函數(shù)。
fn2(2, "我是一只傻鳥"); // 用function對象調(diào)用類的靜態(tài)成員函數(shù)。
// 仿函數(shù)。
BB bb;
bb(3, "我是一只傻鳥");
function<void(int, const string&)> fn3 = BB(); // 包裝仿函數(shù)
fn3(3, "我是一只傻鳥");
// 創(chuàng)建lambda對象。
auto lb = [](int bh, const string& message){
std::cout << "親愛的" << bh << "," << message << std::endl;
};
lb(4, "我是一只傻鳥"); // 調(diào)用lambda函數(shù)。
function<void(int, const string&)> fn4 = lb; // 包裝lamba函數(shù)。
fn4(4, "我是一只傻鳥"); // 用function對象調(diào)用lamba函數(shù)
// 類的非靜態(tài)成員函數(shù)。
CC cc;
void (CC::*fp5)(int, const string&) = &CC::show; // 定義類成員函數(shù)的指針
(cc.*fp5)(5, "我是一只傻鳥"); // 用類成員函數(shù)的指針調(diào)用類的成員函數(shù)
function<void(CC&, int, const string&)> fn5 = &CC::show; // 包裝成員函數(shù)。
fn5(cc, 5, "我是一只傻鳥"); // 用function對象調(diào)用成員函數(shù)
// 可以被轉(zhuǎn)換為函數(shù)指針的類對象。
DD dd;
dd(6, "我是一只傻傻鳥。"); // 用可以被轉(zhuǎn)換為函數(shù)指針的類對象調(diào)用普通函數(shù)。
function<void(int, const string&)> fn6 = dd; // 包裝可以被轉(zhuǎn)換為函數(shù)指針的類。
fn6(6, "我是一只傻傻鳥。"); // 用function對象調(diào)用它。
function<void(int, const string&)> fx = dd;
try {
if (fx) fx(7, "我是一只傻傻鳥。");
}
catch (std::bad_function_call e) {
cout << "拋出了std::bad_function_call異常。";
}
std::cout << "hello world end" << std::endl;
return 0;
}
2, 適配器bind 的基本用法
std::bind()模板函數(shù)是一個(gè)通用的函數(shù)適配器(綁定器),它用一個(gè)可調(diào)用對象及其參數(shù),生成一個(gè)新的可調(diào)用對象,以適應(yīng)模板
#include <iostream>
#include <functional>
using namespace std;
// 普通函數(shù)
void show(int bh, const string& message) {
cout << "親愛的" << bh << "號(hào)," << message << endl;
}
int main()
{
function<void(int, const string&)> fn1 = show;
function<void(int, const string&)> fn2 = bind(show, placeholders::_1, placeholders::_2);
fn1(1, "我是一只傻傻鳥。");
fn2(2, "我是一只傻傻鳥。");
function<void(const string&, int)> fn3 = bind(show, placeholders::_2, placeholders::_1);
fn3("我是一只傻傻鳥。", 3);
function<void(const string&)> fn4 = bind(show, 4, placeholders::_1);
fn4("我是一只傻傻鳥。");
function<void(int, const string&,int)> fn5 = bind(show, placeholders::_1, placeholders::_2);
fn5(5, "我是一只傻傻鳥。", 88);
return 0;
}
2, 適配器bind 的綁定六種可調(diào)用對象
#include <iostream>
#include <functional>
using namespace std;
// 普通函數(shù)
void show(int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
}
struct AA // 類中有靜態(tài)成員函數(shù)。
{
static void show(int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
}
};
struct BB // 仿函數(shù)。
{
void operator()(int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
}
};
struct CC // 類中有普通成員函數(shù)。
{
void show(int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
}
};
struct DD // 可以被轉(zhuǎn)換為普通函數(shù)指針的類。
{
using Fun = void (*)(int, const string&); // 函數(shù)指針的別名。
operator Fun() {
return show; // 返回普通函數(shù)show的地址。
}
};
int main()
{
// 普通函數(shù)。
function<void(int, const string&)> fn1 = bind(show, placeholders::_1, placeholders::_2); // 綁定普通全局函數(shù)show。
fn1(1, "我是一只烏龜。"); // 用function對象調(diào)用普通全局函數(shù)show。
// 類的靜態(tài)成員函數(shù)。
function<void(int, const string&)> fn2 = bind(AA::show, placeholders::_1, placeholders::_2); // 綁定類的靜態(tài)成員函數(shù)。
fn2(2, "我是一只烏龜。"); // 用function對象調(diào)用類的靜態(tài)成員函數(shù)。
// 仿函數(shù)。
function<void(int, const string&)> fn3 = bind(BB(), placeholders::_1, placeholders::_2); // 綁定仿函數(shù)。
fn3(3, "我是一只烏龜。"); // 用function對象調(diào)用仿函數(shù)。
// 創(chuàng)建lambda對象。
auto lb = [](int bh, const string& message) {
cout << "親愛的" << bh << "," << message << endl;
};
function<void(int, const string&)> fn4 = bind(lb, placeholders::_1, placeholders::_2); // 綁定lamba函數(shù)。
fn4(4, "我是一只烏龜。"); // 用function對象調(diào)用lamba函數(shù)。
// 類的非靜態(tài)成員函數(shù)。
CC cc;
//function<void(CC&, int, const string&)> fn11 = bind(&CC::show, placeholders::_1, placeholders::_2, placeholders::_3); // 綁定成員函數(shù)。
//fn11(cc, 5, "我是一只烏龜。"); // 用function對象調(diào)用成員函數(shù)。
function<void(int, const string&)> fn5 = bind(&CC::show,&cc,placeholders::_1, placeholders::_2); // 綁定成員函數(shù)。
fn5(5, "我是一只烏龜。"); // 用function對象調(diào)用成員函數(shù)。
// 可以被轉(zhuǎn)換為函數(shù)指針的類對象。
DD dd;
function<void(int, const string&)> fn6 = bind(dd, placeholders::_1, placeholders::_2); // 綁定可以被轉(zhuǎn)換為函數(shù)指針的類。
fn6(6, "我是一只烏龜。"); // 用function對象調(diào)用它。
return 0;
}