c++中的bind使用方法
除了容器有適配器之外,其實函數(shù)也提供了適配器,適配器的特點就是將一個類型改裝成為擁有子集功能的新的類型。其中函數(shù)的適配器典型的就是通過std::bind來實現(xiàn)。
std::bind函數(shù)定義在頭文件functional中,是一個函數(shù)模板,它就像一個函數(shù)適配器,接受一個可調(diào)用對象(callable object),生成一個新的可調(diào)用對象來“適應(yīng)”原對象的參數(shù)列表。一般而言,我們用它可以把一個原本接收N個參數(shù)的函數(shù)fn,通過綁定一些參數(shù),返回一個接收M個(M可以大于N,但這么做沒什么意義)參數(shù)的新函數(shù)。同時,使用std::bind函數(shù)還可以實現(xiàn)參數(shù)順序調(diào)整等操作。
如可調(diào)用 (Callable) 中描述,調(diào)用指向非靜態(tài)成員函數(shù)指針或指向非靜態(tài)數(shù)據(jù)成員指針時,首參數(shù)必須是引用或指針(可以包含智能指針,如 std::shared_ptr 與 std::unique_ptr),指向?qū)⒃L問其成員的對象。
#include <random>
#include <iostream>
#include <memory>
#include <functional>
void f(int n1, int n2, int n3, const int& n4, int n5)
{
std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 << '\n';
}
int g(int n1)
{
return n1;
}
struct Foo {
void print_sum(int n1, int n2)
{
std::cout << n1+n2 << '\n';
}
int data = 10;
};
int main()
{
using namespace std::placeholders; // 對于 _1, _2, _3...
// 演示參數(shù)重排序和按引用傳遞
int n = 7;
// ( _1 與 _2 來自 std::placeholders ,并表示將來會傳遞給 f1 的參數(shù))
auto f1 = std::bind(f, _2, 42, _1, std::cref(n), n);
n = 10;
f1(1, 2, 1001); // 1 為 _1 所綁定, 2 為 _2 所綁定,不使用 1001
// 進行到 f(2, 42, 1, n, 7) 的調(diào)用
// 嵌套 bind 子表達式共享占位符
auto f2 = std::bind(f, _3, std::bind(g, _3), _3, 4, 5);
f2(10, 11, 12); // 進行到 f(12, g(12), 12, 4, 5); 的調(diào)用
// 常見使用情況:以分布綁定 RNG
std::default_random_engine e;
std::uniform_int_distribution<> d(0, 10);
std::function<int()> rnd = std::bind(d, e); // e 的一個副本存儲于 rnd
for(int n=0; n<10; ++n)
std::cout << rnd() << ' ';
std::cout << '\n';
// 綁定指向成員函數(shù)指針
Foo foo;
auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1);
f3(5);
// 綁定指向數(shù)據(jù)成員指針
auto f4 = std::bind(&Foo::data, _1);
std::cout << f4(foo) << '\n';
// 智能指針亦能用于調(diào)用被引用對象的成員
std::cout << f4(std::make_shared<Foo>(foo)) << '\n'
<< f4(std::make_unique<Foo>(foo)) << '\n';
}
輸出:
2 42 1 10 7
12 12 12 4 5
1 5 0 2 0 8 2 2 10 8
100
10
10
10
到此這篇關(guān)于c++中的bind使用方法的文章就介紹到這了,更多相關(guān)c++ bind使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)查找中位數(shù)的O(N)算法和Kmin算法
這篇文章主要介紹了C++實現(xiàn)查找中位數(shù)的O(N)算法和Kmin算法,對于C++程序算法設(shè)計有一定的借鑒價值,需要的朋友可以參考下2014-09-09
C語言中數(shù)據(jù)結(jié)構(gòu)之鏈表歸并排序?qū)嵗a
這篇文章主要介紹了C語言中數(shù)據(jù)結(jié)構(gòu)之鏈表歸并排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下2017-05-05
C++ 中的 mutable關(guān)鍵字作用與使用場景分析(最新推薦)
C++中的mutable關(guān)鍵字允許在常量成員函數(shù)中修改特定成員變量,主要用于緩存機制、延遲計算和多線程同步等場景,它在設(shè)計中提供靈活性,但使用時需謹(jǐn)慎,本文介紹C++ 中的 mutable關(guān)鍵字作用與使用場景分析,感興趣的朋友一起看看吧2025-02-02
C++實現(xiàn)學(xué)生管理系統(tǒng)示例解析
這篇文章主要介紹了C++實現(xiàn)學(xué)生管理系統(tǒng)示例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
C語言數(shù)據(jù)結(jié)構(gòu)之串插入操作
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之串插入操作的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10

