最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中std::functional 使用場(chǎng)景

 更新時(shí)間:2026年02月19日 10:19:16   作者:sTone87375  
std::functional是C++標(biāo)準(zhǔn)庫(kù)中一個(gè)非常強(qiáng)大的工具,它提供了一種類型擦除機(jī)制,讓你能夠存儲(chǔ)、傳遞和調(diào)用任何可調(diào)用對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

std::functional 是 C++ 標(biāo)準(zhǔn)庫(kù)中一個(gè)非常強(qiáng)大的工具,它提供了一種**類型擦除(type erasure)**機(jī)制,讓你能夠存儲(chǔ)、傳遞和調(diào)用任何可調(diào)用對(duì)象(callable)。

核心作用

1.統(tǒng)一的可調(diào)用對(duì)象包裝器

std::function 可以包裝任何可調(diào)用實(shí)體,只要簽名匹配:

  • 普通函數(shù)
  • Lambda 表達(dá)式
  • 函數(shù)對(duì)象(仿函數(shù))
  • 成員函數(shù)(通過(guò) std::bind 或 lambda)
  • 甚至其他 std::function

2.類型擦除

隱藏具體類型,只暴露接口。這使得你可以:

  • 在容器中存儲(chǔ)不同類型的可調(diào)用對(duì)象
  • 作為函數(shù)參數(shù)接受任意可調(diào)用對(duì)象
  • 實(shí)現(xiàn)回調(diào)機(jī)制而不需要模板

主要使用場(chǎng)景

場(chǎng)景 1:回調(diào)函數(shù)(Callbacks)

#include <functional>
#include <iostream>

class Button {
    std::function<void()> onClick_;
public:
    void setOnClick(std::function<void()> callback) {
        onClick_ = callback;
    }
    void click() { if (onClick_) onClick_(); }
};

// 使用
Button btn;
btn.setOnClick([]() { std::cout << "Clicked!\n"; });
btn.click();

場(chǎng)景 2:策略模式 / 算法注入

#include <functional>
#include <vector>
#include <algorithm>

void processData(std::vector<int>& data, 
                 std::function<bool(int)> filter,
                 std::function<int(int)> transform) {
    // 先過(guò)濾
    data.erase(std::remove_if(data.begin(), data.end(), 
              [&](int x) { return !filter(x); }), data.end());
    // 再轉(zhuǎn)換
    for (auto& x : data) x = transform(x);
}

// 使用
std::vector<int> nums = {1, 2, 3, 4, 5, 6};
processData(nums,
    [](int x) { return x % 2 == 0; },  // 只保留偶數(shù)
    [](int x) { return x * x; }         // 平方
);

場(chǎng)景 3:事件系統(tǒng) / 觀察者模式

#include <functional>
#include <vector>
#include <string>

class EventSystem {
    std::vector<std::function<void(const std::string&)>> listeners_;
public:
    void subscribe(std::function<void(const std::string&)> listener) {
        listeners_.push_back(listener);
    }
    void emit(const std::string& event) {
        for (auto& listener : listeners_) {
            listener(event);
        }
    }
};

// 使用
EventSystem events;
events.subscribe([](const std::string& e) { 
    std::cout << "Logger: " << e << "\n"; 
});
events.subscribe([](const std::string& e) { 
    std::cout << "Metrics: recorded " << e << "\n"; 
});

場(chǎng)景 4:延遲執(zhí)行 / 任務(wù)隊(duì)列

#include <functional>
#include <queue>
#include <iostream>

class TaskQueue {
    std::queue<std::function<void()>> tasks_;
public:
    void addTask(std::function<void()> task) {
        tasks_.push(task);
    }
    void runAll() {
        while (!tasks_.empty()) {
            tasks_.front()();
            tasks_.pop();
        }
    }
};

// 使用
TaskQueue queue;
queue.addTask([]() { std::cout << "Task 1\n"; });
queue.addTask([]() { std::cout << "Task 2\n"; });
queue.runAll();

場(chǎng)景 5:綁定成員函數(shù)

#include <functional>
#include <iostream>

class Calculator {
public:
    int add(int a, int b) { return a + b; }
    int multiply(int a, int b) { return a * b; }
};

// 使用 std::bind
Calculator calc;
auto addFunc = std::bind(&Calculator::add, &calc, 
                         std::placeholders::_1, std::placeholders::_2);
std::cout << addFunc(3, 4); // 7

// 或者使用 lambda(更推薦,性能更好)
auto multiplyFunc = [&calc](int a, int b) { 
    return calc.multiply(a, b); 
};

std::functionvs 模板 vs 裸函數(shù)指針

特性std::function模板裸函數(shù)指針
類型擦除? 是? 否? 是(但只能指向函數(shù))
存儲(chǔ) Lambda? 可以? 可以? 不行(除非無(wú)捕獲)
運(yùn)行時(shí)開銷有(虛函數(shù)調(diào)用)無(wú)無(wú)
編譯時(shí)類型檢查弱(運(yùn)行時(shí)可能拋 bad_function_call)強(qiáng)強(qiáng)
存儲(chǔ)在容器中? 容易? 難(需要類型擦除)? 可以

最佳實(shí)踐

  1. 優(yōu)先使用模板:如果不需要存儲(chǔ)可調(diào)用對(duì)象,用模板參數(shù)更高效

    // 更好:零開銷
    template<typename Func>
    void execute(Func&& f) { f(); }
    
    // 有開銷:類型擦除
    void execute(std::function<void()> f) { f(); }
    
  2. 檢查空狀態(tài):調(diào)用前確保 std::function 不為空

    if (func) func();  // 或 if (func != nullptr)
    
  3. 注意開銷std::function 通常使用小對(duì)象優(yōu)化(SOO),但大對(duì)象會(huì)堆分配

  4. C++23 替代:考慮使用 std::move_only_function(僅移動(dòng))或 std::copyable_function

std::functional 的核心價(jià)值在于靈活性——當(dāng)你需要在運(yùn)行時(shí)決定調(diào)用什么、或者需要在容器中存儲(chǔ)可調(diào)用對(duì)象時(shí),它是不可或缺的工具。

到此這篇關(guān)于C++中std::functional 使用場(chǎng)景的文章就介紹到這了,更多相關(guān)C++ std::functional 使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文詳解C語(yǔ)言操作符

    一文詳解C語(yǔ)言操作符

    這篇文章主要詳細(xì)介紹了C語(yǔ)言的操作符,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 一文帶你學(xué)習(xí)C/C++中的<Windows.h>庫(kù)

    一文帶你學(xué)習(xí)C/C++中的<Windows.h>庫(kù)

    c語(yǔ)言 #include<windows.h>是寫window程序需要的重要頭文件,下面這篇文章主要給大家介紹了C/C++中<Windows.h>庫(kù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • C++程序代碼的五大內(nèi)存分區(qū)方式

    C++程序代碼的五大內(nèi)存分區(qū)方式

    這篇文章主要介紹了C++程序代碼的五大內(nèi)存分區(qū)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • C語(yǔ)言強(qiáng)制類型轉(zhuǎn)換規(guī)則實(shí)例詳解

    C語(yǔ)言強(qiáng)制類型轉(zhuǎn)換規(guī)則實(shí)例詳解

    強(qiáng)制類型轉(zhuǎn)換是把變量從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言強(qiáng)制類型轉(zhuǎn)換的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C++自定義(手撕)vector類實(shí)現(xiàn)過(guò)程

    C++自定義(手撕)vector類實(shí)現(xiàn)過(guò)程

    文章介紹了C++中std::vector的簡(jiǎn)化實(shí)現(xiàn),涵蓋模板類定義、動(dòng)態(tài)數(shù)組管理、構(gòu)造析構(gòu)函數(shù)、深拷貝機(jī)制、迭代器及容量操作等核心內(nèi)容,旨在通過(guò)手動(dòng)實(shí)現(xiàn)理解其內(nèi)存管理原理和底層實(shí)現(xiàn)邏輯
    2025-09-09
  • opencv?C++模板匹配的簡(jiǎn)單實(shí)現(xiàn)

    opencv?C++模板匹配的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了opencv?C++模板匹配的簡(jiǎn)單實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Vscode中接入Deepseek的實(shí)現(xiàn)

    Vscode中接入Deepseek的實(shí)現(xiàn)

    本文主要介紹了Vscode中接入Deepseek的實(shí)現(xiàn),包括登錄Deepseek官網(wǎng)、申請(qǐng)APIKEY、安裝和配置VSCode插件,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • C++ 基礎(chǔ)編程之十進(jìn)制轉(zhuǎn)換為任意進(jìn)制及操作符重載

    C++ 基礎(chǔ)編程之十進(jìn)制轉(zhuǎn)換為任意進(jìn)制及操作符重載

    這篇文章主要介紹了C++ 基礎(chǔ)編程之十進(jìn)制轉(zhuǎn)換為任意進(jìn)制及操作符重載的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C++ set的使用方法詳解

    C++ set的使用方法詳解

    這篇文章主要介紹了C++ set的使用方法詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握set的使用方法,需要的朋友可以參考下
    2017-10-10
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的學(xué)生學(xué)籍管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論

肃宁县| 金华市| 太白县| 繁昌县| 固镇县| 尖扎县| 合水县| 亚东县| 海淀区| 汉沽区| 神木县| 博客| 合作市| 普洱| 新化县| 怀宁县| 安泽县| 吉木乃县| 台前县| 唐河县| 丰城市| 株洲市| 宜昌市| 库车县| 芦溪县| 南充市| 前郭尔| 达拉特旗| 凌云县| 昌图县| 宁陵县| 古丈县| 肃宁县| 土默特左旗| 安西县| 延庆县| 凉山| 金溪县| 扎鲁特旗| 武城县| 合山市|