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

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

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

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

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

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

C++ 標準庫提供了多種內置包裝器,同時也支持自定義包裝器。按包裝對象的不同,主要分為以下幾類:

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

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

核心用途:

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

語法與示例:

#include <functional>
#include <iostream>

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

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

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

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

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

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

    // 包裝類成員函數(需綁定實例)
    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;
}

關鍵說明:

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

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

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

核心用途:

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

示例:

#include <memory>
#include <iostream>

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

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

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

    // 無需手動 delete,作用域結束時自動析構
    return 0;
}

關鍵說明:

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

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

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

常見類型:

  • std::reverse_iterator:反向迭代器(包裝正向迭代器,實現反向遍歷);
  • std::insert_iterator:插入迭代器(包裝容器迭代器,實現“插入”而非“覆蓋”賦值);
  • 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;
}

關鍵說明:

  • 迭代器適配器不改變容器的存儲結構,僅包裝迭代器的 operator++/operator* 等行為;
  • 對外提供統(tǒng)一的迭代器接口(如 ++、*),用戶無需關心底層實現差異。

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

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

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

核心作用:綁定可調用對象的部分參數,生成參數更少的新函數。

示例:

#include <functional>
#include <iostream>

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

int main() {
    // 綁定第一個參數為 10,生成新函數: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

    // 綁定后兩個參數為 5、6,生成新函數: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:邏輯取反適配器

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

示例:

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

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

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

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

    return 0;
}

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

除了標準庫提供的包裝器,也可以手動實現類級別的包裝器,用于適配不同接口的類。

場景:

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

示例:

#include <iostream>
#include <string>

// 舊接口(無法修改)
class OldInterface {
public:
    void do_old_task(const std::string& msg) {
        std::cout << "舊接口執(zhí)行任務:" << 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 {
        // 轉換接口:新接口的 execute 調用舊接口的 do_old_task
        old_obj.do_old_task("適配后:" + task);
    }
};

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

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

關鍵說明:

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

二、包裝器的核心特性

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

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

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

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

示例區(qū)別:

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

總結

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

  • 標準庫內置包裝器:std::function(函數)、智能指針(指針)、迭代器適配器(迭代器)、std::bind(函數參數);
  • 自定義包裝器:類級別的接口適配。

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

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

相關文章

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

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

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

    VS2019配置opencv詳細圖文教程和測試代碼的實現

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

    C++應用Eigen庫對應實現matlab中部分函數問題

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

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

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

    C++單例類模板詳解

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

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

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

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

    本文介紹了C++中繼承的概念與定義,重點講解了繼承的訪問權限變化、基類與派生類間的轉換規(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,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-02-02
  • C語言通過深度優(yōu)先搜索來解電梯問題和N皇后問題的示例

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

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

    C++代碼實現逆波蘭式

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

最新評論

瓮安县| 常宁市| 武山县| 永寿县| 昆山市| 新昌县| 西畴县| 元江| 南陵县| 于田县| 钦州市| 仁化县| 五华县| 黔江区| 忻城县| 慈利县| 太康县| 嘉善县| 肥城市| 舒兰市| 德惠市| 德安县| 南宁市| 盱眙县| 仁怀市| 洪江市| 巫山县| 边坝县| 遵义县| 来宾市| 抚宁县| 大同县| 嘉祥县| 肥东县| 高淳县| 巫山县| 宾阳县| 湘乡市| 阿拉善右旗| 临夏县| 伊吾县|