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

C++中包裝器的使用示例

 更新時間:2026年02月02日 09:17:03   作者:上去我就QWER  
C++中的包裝器是一種結(jié)構(gòu)型設(shè)計模式,用于包裝已有對象以轉(zhuǎn)換接口或增強功能,下面就來詳細(xì)的介紹一下如何使用,具有一定的參考價值,感興趣的可以了解一下

在 C++ 中,包裝器(Wrapper) 也常被稱為適配器(Adapter),是一種設(shè)計模式(結(jié)構(gòu)型模式)的實現(xiàn)——核心作用是包裝一個已有對象(或函數(shù)、指針等),轉(zhuǎn)換其接口、隱藏實現(xiàn)細(xì)節(jié),或增強其功能,讓原本不兼容的接口能夠協(xié)同工作,同時不改變原對象的邏輯。

包裝器的核心價值:解耦、復(fù)用、接口統(tǒng)一。它就像一個“翻譯官”,讓兩個原本無法直接溝通的組件(如不同接口的類、不同格式的函數(shù))能夠正常交互。

一、C++ 中常見的包裝器類型

C++ 標(biāo)準(zhǔn)庫提供了多種內(nèi)置包裝器,同時也支持自定義包裝器。按包裝對象的不同,主要分為以下幾類:

1. 函數(shù)包裝器(std::function)

最常用的包裝器,用于包裝任意可調(diào)用對象(函數(shù)指針、lambda 表達(dá)式、函數(shù)對象、類成員函數(shù)等),統(tǒng)一其調(diào)用接口。

核心用途:

  • 消除可調(diào)用對象的類型差異,實現(xiàn)“類型擦除”(例如,不同簽名的函數(shù)統(tǒng)一用 std::function 存儲);
  • 作為回調(diào)函數(shù)的統(tǒng)一載體(如 GUI 事件回調(diào)、異步任務(wù)回調(diào))。

語法與示例:

#include <functional>
#include <iostream>

// 普通函數(shù)
int add(int a, int b) { return a + b; }

// 函數(shù)對象(仿函數(shù))
struct Multiply {
    int operator()(int a, int b) { return a * b; }
};

// 類成員函數(shù)
class Calculator {
public:
    int subtract(int a, int b) { return a - b; }
};

int main() {
    // 包裝普通函數(shù)
    std::function<int(int, int)> func1 = add;
    std::cout << func1(2, 3) << std::endl;  // 輸出 5

    // 包裝函數(shù)對象
    std::function<int(int, int)> func2 = Multiply{};
    std::cout << func2(2, 3) << std::endl;  // 輸出 6

    // 包裝 lambda 表達(dá)式
    std::function<int(int, int)> func3 = [](int a, int b) { return a / b; };
    std::cout << func3(6, 2) << std::endl;  // 輸出 3

    // 包裝類成員函數(shù)(需綁定實例)
    Calculator calc;
    std::function<int(int, int)> func4 = std::bind(&Calculator::subtract, &calc, std::placeholders::_1, std::placeholders::_2);
    std::cout << func4(5, 2) << std::endl;  // 輸出 3

    return 0;
}

關(guān)鍵說明:

  • std::function 的模板參數(shù)是函數(shù)簽名(返回值類型 + 參數(shù)類型列表);
  • 支持拷貝、賦值,可作為容器元素(如 std::vector<std::function<int(int)>>);
  • 空的 std::function 調(diào)用會拋出 std::bad_function_call 異常。

2. 指針包裝器(智能指針:std::unique_ptr/std::shared_ptr)

智能指針是裸指針的包裝器,核心作用是自動管理內(nèi)存(避免內(nèi)存泄漏),同時提供與裸指針兼容的接口(如 operator*operator->)。

核心用途:

  • 替代裸指針,實現(xiàn)“資源自動釋放”(RAII 機制);
  • 隱藏內(nèi)存管理細(xì)節(jié)(如引用計數(shù)、獨占所有權(quán))。

示例:

#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass 構(gòu)造" << std::endl; }
    ~MyClass() { std::cout << "MyClass 析構(gòu)" << std::endl; }
    void show() { std::cout << "Hello MyClass" << std::endl; }
};

int main() {
    // std::unique_ptr:獨占所有權(quán)
    std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
    ptr1->show();  // 接口與裸指針一致

    // std::shared_ptr:共享所有權(quán)(引用計數(shù))
    std::shared_ptr<MyClass> ptr2 = std::make_shared<MyClass>();
    std::shared_ptr<MyClass> ptr3 = ptr2;  // 引用計數(shù)+1
    ptr3->show();

    // 無需手動 delete,作用域結(jié)束時自動析構(gòu)
    return 0;
}

關(guān)鍵說明:

  • 智能指針是“資源包裝器”,遵循 RAII(資源獲取即初始化)原則;
  • 包裝了裸指針的“內(nèi)存管理”邏輯,但對外提供與裸指針兼容的接口,不改變原類的使用方式。

3. 迭代器適配器(std::reverse_iterator/std::insert_iterator等)

迭代器適配器是原生迭代器的包裝器,用于轉(zhuǎn)換迭代器的行為(如反向遍歷、插入元素而非覆蓋),讓同一容器支持不同的遍歷/操作方式。

常見類型:

  • std::reverse_iterator:反向迭代器(包裝正向迭代器,實現(xiàn)反向遍歷);
  • std::insert_iterator:插入迭代器(包裝容器迭代器,實現(xiàn)“插入”而非“覆蓋”賦值);
  • std::back_insert_iterator/std::front_insert_iterator:尾部/頭部插入迭代器。

示例(反向迭代器):

#include <vector>
#include <iostream>
#include <iterator>  // 包含迭代器適配器

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 正向遍歷
    std::cout << "正向遍歷:";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";  // 輸出 1 2 3 4 5
    }
    std::cout << std::endl;

    // 反向遍歷(使用 reverse_iterator 包裝 begin()/end())
    std::cout << "反向遍歷:";
    for (auto it = std::reverse_iterator(vec.end()); it != std::reverse_iterator(vec.begin()); ++it) {
        std::cout << *it << " ";  // 輸出 5 4 3 2 1
    }
    std::cout << std::endl;

    return 0;
}

關(guān)鍵說明:

  • 迭代器適配器不改變?nèi)萜鞯拇鎯Y(jié)構(gòu),僅包裝迭代器的 operator++/operator* 等行為;
  • 對外提供統(tǒng)一的迭代器接口(如 ++、*),用戶無需關(guān)心底層實現(xiàn)差異。

4. 函數(shù)適配器(std::bind/std::not_fn)

函數(shù)適配器用于包裝可調(diào)用對象,修改其參數(shù)列表或邏輯(如綁定參數(shù)、取反邏輯),生成新的可調(diào)用對象。

(1)std::bind:參數(shù)綁定適配器

核心作用:綁定可調(diào)用對象的部分參數(shù),生成參數(shù)更少的新函數(shù)。

示例:

#include <functional>
#include <iostream>

int add(int a, int b, int c) { return a + b + c; }

int main() {
    // 綁定第一個參數(shù)為 10,生成新函數(shù):int(int, int)
    auto add10 = std::bind(add, 10, std::placeholders::_1, std::placeholders::_2);
    std::cout << add10(2, 3) << std::endl;  // 10+2+3=15

    // 綁定后兩個參數(shù)為 5、6,生成新函數(shù):int(int)
    auto add56 = std::bind(add, std::placeholders::_1, 5, 6);
    std::cout << add56(4) << std::endl;  // 4+5+6=15

    return 0;
}

(2)std::not_fn:邏輯取反適配器

核心作用:包裝返回布爾值的可調(diào)用對象,生成“邏輯取反”的新函數(shù)(C++17 引入)。

示例:

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

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 查找偶數(shù)(原邏輯:x % 2 == 0)
    auto even = [](int x) { return x % 2 == 0; };
    auto it1 = std::find_if(vec.begin(), vec.end(), even);
    std::cout << "第一個偶數(shù):" << *it1 << std::endl;  // 輸出 2

    // 查找奇數(shù)(包裝 even,邏輯取反)
    auto odd = std::not_fn(even);
    auto it2 = std::find_if(vec.begin(), vec.end(), odd);
    std::cout << "第一個奇數(shù):" << *it2 << std::endl;  // 輸出 1

    return 0;
}

5. 自定義包裝器(類適配器)

除了標(biāo)準(zhǔn)庫提供的包裝器,也可以手動實現(xiàn)類級別的包裝器,用于適配不同接口的類。

場景:

假設(shè)已有一個舊接口的類 OldInterface,新代碼需要使用統(tǒng)一的 NewInterface 接口,此時可通過包裝器適配。

示例:

#include <iostream>
#include <string>

// 舊接口(無法修改)
class OldInterface {
public:
    void do_old_task(const std::string& msg) {
        std::cout << "舊接口執(zhí)行任務(wù):" << msg << std::endl;
    }
};

// 新接口(統(tǒng)一規(guī)范)
class NewInterface {
public:
    virtual ~NewInterface() = default;
    virtual void execute(const std::string& task) = 0;
};

// 包裝器(適配器):將 OldInterface 適配為 NewInterface
class OldToNewAdapter : public NewInterface {
private:
    OldInterface old_obj;  // 包裝舊接口對象
public:
    void execute(const std::string& task) override {
        // 轉(zhuǎn)換接口:新接口的 execute 調(diào)用舊接口的 do_old_task
        old_obj.do_old_task("適配后:" + task);
    }
};

// 新代碼使用統(tǒng)一接口
void use_new_interface(NewInterface& obj) {
    obj.execute("完成數(shù)據(jù)處理");
}

int main() {
    OldToNewAdapter adapter;
    use_new_interface(adapter);  // 輸出:舊接口執(zhí)行任務(wù):適配后:完成數(shù)據(jù)處理
    return 0;
}

關(guān)鍵說明:

  • 自定義包裝器通常采用“組合”(包裝被適配對象)或“繼承”(適配接口)的方式;
  • 核心是“接口轉(zhuǎn)換”:對外提供目標(biāo)接口,對內(nèi)調(diào)用被包裝對象的原有接口。

二、包裝器的核心特性

  1. 接口轉(zhuǎn)換:將被包裝對象的接口轉(zhuǎn)換為目標(biāo)接口(如 OldInterfaceNewInterface);
  2. 透明性:用戶無需關(guān)心被包裝對象的細(xì)節(jié),僅需使用包裝器提供的統(tǒng)一接口;
  3. 增強功能:可在包裝器中添加額外邏輯(如日志、緩存、權(quán)限校驗),不修改原對象;
  4. 復(fù)用性:同一包裝器可適配多個同類被包裝對象(如 std::function 可包裝任意符合簽名的可調(diào)用對象)。

三、包裝器與裝飾器的區(qū)別(易混淆點)

很多人會將包裝器(適配器)與裝飾器(Decorator)混淆,兩者核心差異在于目的不同

  • 「包裝器(適配器)」:核心是接口適配(讓不兼容的接口協(xié)同工作);
  • 「裝飾器」:核心是功能增強(在不改變接口的前提下,動態(tài)添加新功能)。

示例區(qū)別:

  • 適配器:將 OldInterface::do_old_task 適配為 NewInterface::execute(接口變了);
  • 裝飾器:給 NewInterface::execute 增加日志功能(接口不變,功能變了)。

總結(jié)

C++ 中的包裝器(適配器)是“接口轉(zhuǎn)換與復(fù)用”的核心工具,分為:

  • 標(biāo)準(zhǔn)庫內(nèi)置包裝器:std::function(函數(shù))、智能指針(指針)、迭代器適配器(迭代器)、std::bind(函數(shù)參數(shù));
  • 自定義包裝器:類級別的接口適配。

其核心價值是解耦(隔離不同接口的組件)、復(fù)用(無需修改原有代碼)、統(tǒng)一接口(降低使用成本),是 C++ 中實現(xiàn)靈活設(shè)計的重要手段。

到此這篇關(guān)于C++中包裝器的使用示例的文章就介紹到這了,更多相關(guān)C++ 包裝器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++利用循環(huán)和棧實現(xiàn)走迷宮

    C++利用循環(huán)和棧實現(xiàn)走迷宮

    這篇文章主要為大家詳細(xì)介紹了C++利用循環(huán)和棧實現(xiàn)走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • VS2019配置opencv詳細(xì)圖文教程和測試代碼的實現(xiàn)

    VS2019配置opencv詳細(xì)圖文教程和測試代碼的實現(xiàn)

    這篇文章主要介紹了VS2019配置opencv詳細(xì)圖文教程和測試代碼的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C++應(yīng)用Eigen庫對應(yīng)實現(xiàn)matlab中部分函數(shù)問題

    C++應(yīng)用Eigen庫對應(yīng)實現(xiàn)matlab中部分函數(shù)問題

    這篇文章主要介紹了C++應(yīng)用Eigen庫對應(yīng)實現(xiàn)matlab中部分函數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C++基本用法實踐之移動語義詳解

    C++基本用法實踐之移動語義詳解

    移動(move)語義是C++引入了一種新的內(nèi)存優(yōu)化,以避免不必要的拷貝,下面小編就來和大家簡單聊聊C++中移動語義的相關(guān)使用吧,希望對大家有所幫助
    2023-07-07
  • C++單例類模板詳解

    C++單例類模板詳解

    這篇文章主要介紹了C++單例類模板,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C語言實現(xiàn)餐廳管理系統(tǒng)

    C語言實現(xiàn)餐廳管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)餐廳管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++繼承機制、概念、語法、作用域與轉(zhuǎn)換規(guī)則詳解

    C++繼承機制、概念、語法、作用域與轉(zhuǎn)換規(guī)則詳解

    本文介紹了C++中繼承的概念與定義,重點講解了繼承的訪問權(quán)限變化、基類與派生類間的轉(zhuǎn)換規(guī)則以及作用域中的隱藏機制,感興趣的朋友一起看看吧
    2026-05-05
  • windows?使用ffmpeg?.a靜態(tài)庫讀取Wav音頻并保存PCM的方法

    windows?使用ffmpeg?.a靜態(tài)庫讀取Wav音頻并保存PCM的方法

    這篇文章主要介紹了windows?使用ffmpeg?.a靜態(tài)庫讀取Wav音頻并保存PCM,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-02-02
  • C語言通過深度優(yōu)先搜索來解電梯問題和N皇后問題的示例

    C語言通過深度優(yōu)先搜索來解電梯問題和N皇后問題的示例

    深度優(yōu)先搜索即是對一個新發(fā)現(xiàn)的節(jié)點上如果還關(guān)聯(lián)未探測到的邊,就沿此邊探測下去,直到發(fā)現(xiàn)從原點可達(dá)的所有點為止,這里我們就來展示C語言通過深度優(yōu)先搜索來解電梯問題和N皇后問題的示例
    2016-06-06
  • C++代碼實現(xiàn)逆波蘭式

    C++代碼實現(xiàn)逆波蘭式

    這篇文章主要為大家詳細(xì)介紹了C++代碼實現(xiàn)逆波蘭式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論

萨迦县| 大荔县| 原阳县| 六枝特区| 瓦房店市| 乌鲁木齐县| 特克斯县| 乌什县| 上饶县| 上饶县| 金平| 青海省| 偏关县| 白山市| 连州市| 伊宁县| 长葛市| 宣汉县| 吴堡县| 繁峙县| 民权县| 永春县| 织金县| 家居| 太原市| 无极县| 巴里| 玛沁县| 视频| 炉霍县| 石城县| 雅安市| 南汇区| 甘洛县| 高淳县| 白玉县| 敖汉旗| 郯城县| 天水市| 济源市| 革吉县|