首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 函數對象詳解:封裝狀態、適配算法、包裝成員函數

     編輯:關於C++

什麼是函數對象?

實現 operator() 的類。調用語法與函數指針一致:obj(args)。
核心優勢:可攜帶狀態(附加數據),函數指針做不到。

帶狀態的函數對象示例

class Less {
    int threshold;
public:
    Less(int n) : threshold(n) {}
    bool operator()(int value) const { return value < threshold; }
};

// 使用
int arr[] = {50, 30, 9, 7, 20};
auto p1 = std::find_if(std::begin(arr), std::end(arr), Less(10)); // 指向 9
auto p2 = std::find_if(std::begin(arr), std::end(arr), Less(40)); // 指向 30

每個 Less(n) 擁有獨立閾值,靈活復用。

統一接收函數指針與函數對象:模板

template 
int count_if(int* arr, int size, FUNC pred) {
    int cnt = 0;
    for (int i=0; i

進階:包裝成員函數指針

成員函數指針需對象實例調用。函數對象可綁定 this 指針:

template 
class MemFun {
    void (O::*func)(const char*);
    O* obj;
public:
    MemFun(void (O::*f)(const char*), O* o) : func(f), obj(o) {}
    void operator()(const char* name) { (obj->*func)(name); }
};

class A {
public:
    void greet(const char* name) { std::cout << "Hello " << name << "!\n"; }
};

A a;
MemFun caller(&A::greet, &a);
caller("Kitty"); // 輸出 Hello Kitty!

標準庫與 Boost 的擴展

  • std::mem_fun_ref / std::mem_fun:僅支持 0/1 參數,語法冗長。
  • boost::function:默認支持 10 參數,最多 50,實現極其複雜(模板偏特化 + 宏)。
  • C++11 可變參數模板徹底解決:單一模板支持任意參數,std::function 成為標準。

函數對象是 STL 算法靈活性的基石,掌握其定義、狀態攜帶、模板適配與成員函數綁定,是高效使用 C++ 標準庫的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved