Effective C++ 條款45:運用成員函數模板接受所有兼容類型

Effective C++ 條款45:運用成員函數模板接受所有兼容類型


核心思想使用成員函數模板(member function templates)生成可接受兼容類型的函數,特別是泛型拷貝構造函數和賦值操作符,同時避免抑制編譯器生成的默認特殊成員函數。

?? 1. 智能指針的類型轉換問題

問題根源

  • 希望智能指針能模擬內置指針的隱式轉換(如派生類指針到基類指針)
  • 模板實例化后不同模板參數生成的是不同類,無法直接轉換
  • 需要為每種可能的兼容類型單獨編寫構造函數,不現實

錯誤示例

template<typename T>
class SmartPtr {
public:explicit SmartPtr(T* realPtr); // 原始指針構造函數// 希望支持以下轉換,但無法實現:// SmartPtr<Base> = SmartPtr<Derived>// SmartPtr<const T> = SmartPtr<T>
};

🚨 2. 成員函數模板解決方案

解決方案

  • 聲明成員函數模板(泛型拷貝構造函數)
  • 使用類型約束確保安全轉換

優化實現

template<typename T>
class SmartPtr {
public:template<typename U>SmartPtr(const SmartPtr<U>& other)  // 泛型拷貝構造: heldPtr(other.get()) { }     // 使用get()獲取原始指針T* get() const { return heldPtr; } // 獲取原始指針private:T* heldPtr; // 持有原始指針
};

類型安全約束

  • 添加編譯期類型檢查,確保U可隱式轉換為T
template<typename T>
class SmartPtr {
public:template<typename U, typename = std::enable_if_t<std::is_convertible_v<U*, T*>>>SmartPtr(const SmartPtr<U>& other): heldPtr(other.get()) { }// ...
};

?? 3. 賦值操作與兼容性處理

問題場景

  • 需要支持不同類型的智能指針賦值
  • 同時要避免編譯器自動生成默認拷貝操作

解決方案

  • 為賦值操作定義成員模板函數
  • 顯式聲明普通拷貝操作以避免被模板隱藏

完整實現

template<typename T>
class SmartPtr {
public:// 泛型拷貝構造template<typename U, typename = std::enable_if_t<std::is_convertible_v<U*, T*>>>SmartPtr(const SmartPtr<U>& other);// 顯式聲明普通拷貝構造和賦值(防止被模板隱藏)SmartPtr(const SmartPtr&); SmartPtr& operator=(const SmartPtr&);// 泛型賦值操作符template<typename U, typename = std::enable_if_t<std::is_convertible_v<U*, T*>>>SmartPtr& operator=(const SmartPtr<U>& other);// ... 其他成員 ...
};

注意事項

  • 成員函數模板不改變語言規則:拷貝構造函數不會阻止編譯器生成默認拷貝構造函數
  • 若需要完全控制,可顯式定義或使用=default/=delete

💡 關鍵設計原則

  1. 使用成員函數模板實現泛型構造
    成員函數模板可生成接受任意兼容類型的構造函數和賦值函數

    template<typename T>
    class SharedPtr {
    public:template<typename Y>explicit SharedPtr(Y* p);  // 從任意類型指針構造template<typename Y>SharedPtr(const SharedPtr<Y>& r); // 兼容類型拷貝構造
    };
    
  2. 添加類型轉換約束
    使用std::enable_if和類型特征確保安全轉換

    template<typename T>
    class SmartPtr {template<typename U, typename = std::enable_if_t<std::is_convertible_v<U*, T*>>>SmartPtr(const SmartPtr<U>&);
    };
    
  3. 顯式聲明默認函數
    避免成員模板隱藏編譯器生成的默認函數

    template<typename T>
    class SmartPtr {
    public:// 顯式聲明拷貝操作SmartPtr(const SmartPtr&); SmartPtr& operator=(const SmartPtr&);// 成員模板構造函數...
    };
    

實戰:跨類型智能指針賦值

class Base { /*...*/ };
class Derived : public Base { /*...*/ };SmartPtr<Base> pBase(new Base);
SmartPtr<Derived> pDerived(new Derived);// 使用成員模板實現兼容類型賦值
pBase = pDerived;  // 正確:通過泛型賦值操作符// 錯誤示例:類型不兼容
SmartPtr<int> pInt(new int);
// pBase = pInt; // 編譯錯誤:類型約束阻止轉換

類型特征約束進階

// 使用更精確的約束:派生關系
template<typename T>
class SmartPtr {template<typename U, typename = std::enable_if_t<std::is_base_of_v<T, U> || std::is_convertible_v<U*, T*>>>SmartPtr(const SmartPtr<U>&);
};

總結成員函數模板允許類模板生成接受任意兼容類型的函數,是實現泛型拷貝構造和賦值操作的關鍵技術。通過添加編譯期類型約束(如std::enable_if和類型特征)確保轉換安全,同時顯式聲明默認拷貝操作以避免被模板隱藏。這一技術廣泛用于智能指針、迭代器等需要類型靈活性的場景,是編寫高級模板代碼的必備技能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919088.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華測科技(北京)的3D GPR數據分析

很高興得到了張總的支持&#xff0c;獲得了他們雷達的數據&#xff0c;并寫了雷達數據讀取和轉換文件。1 背景搜索后發現 華測科技&#xff08;北京&#xff09;有限公司 的實力很強&#xff0c;因為他們的檢測可達100km/h的時速。以前我只知道行業內 青島中電眾益 的3D GPR產…

X86、ARM與C86架構全面對比分析:性能、功耗、成本與生態系統

目錄標題X86、ARM與C86架構全面對比分析&#xff1a;性能、功耗、成本與生態系統一、架構概述與發展背景1.1 X86架構&#xff1a;PC與服務器市場的傳統霸主1.2 ARM架構&#xff1a;移動領域的王者與新興服務器力量1.3 C86架構&#xff1a;國產x86兼容的創新嘗試二、性能表現對比…

w嵌入式分享合集66

自己的原文哦~ https://blog.51cto.com/whaosoft/14132240 一、STM32的NRST管腳異常復位問題 這個問題是客戶對開發的平臺做EMS 浪涌測試的時候發生的&#xff0c;平臺上使用了一個STM32G474 RCT6 MCU 。在某個等級的EMS 測試中&#xff0c; 客戶發現MCU有時候會異常…

ZKmall開源商城的數據校驗之道:用規范守護業務基石

在電商系統里&#xff0c;數據就像流淌的血液 —— 用戶填的手機號、下單的商品數量、支付的金額&#xff0c;每一個數字、每一段文字都得靠譜。要是數據出了錯&#xff0c;輕則訂單下不了&#xff0c;重則錢貨兩空。ZKmall 開源商城作為一個分布式電商系統&#xff0c;每天要處…

QML實現數據可視化

界面樣式 項目開發流程 1.通過QtCreator創建一個Qt Quick插件,插件命名為CarPanMod; 2.通過QtCreator創建一個Qt Quick Application,命名為QmlPro; 3.在插件CarPanMod中實現條形圖,折線圖和餅狀圖的繪制; 4.在應用程序QmlPro中,添加插件的導入路徑; 5.在應用程序中,通過i…

實時計算 記錄

《大數據架構師》海量實時廣告流平臺架構設計與實踐 《架構師必備技能之集群資源評估.pdf》 參考&#xff1a; 大型廣告系統架構與實現 架構圖

gitee_流水線搭配 Dockerfile 部署vue項目

使用 gitee流水線搭配docker,編寫Dockerfile文件進行自動部署Vue項目 gitee流水線 基本配置跟另外一篇文章中類似 gitee_配置自動部署vue項目-CSDN博客 需要修改的只是腳本執行 # 構建階段腳本echo 清理舊文件 rm -rf dist echo 配置 Git 參數 git config --global http.pos…

Win10快速安裝.NET3.5

按Windows鍵輸入CONTROL打開“控制面板”點擊“程序”點擊“啟用或關閉Windows功能”勾選“.NET Framework3.5&#xff08;包括.NET2.0和3.0&#xff09;”點擊確定隨后選擇從更新下載&#xff08;具體提示忘記了&#xff09;&#xff0c;之后windows會自動安裝

Docker Compose 入門教程

一、Docker Compose 簡介 Docker Compose 是 Docker 官方提供的多容器編排工具&#xff0c;通過 YAML 文件&#xff08;docker-compose.yml&#xff09;定義應用程序的服務、網絡和卷&#xff0c;實現一鍵式容器管理。其核心優勢包括&#xff1a; 簡化多容器管理&#xff1a;通…

Tomcat架構深度解析:從Server到Servlet的全流程揭秘

第一章&#xff1a;Tomcat架構概述1.1 Tomcat的角色與定位&#xff1a;Web服務器 vs Servlet容器Tomcat 是什么&#xff1f;它既是一種輕量級 Web 服務器&#xff0c;也是一種符合 Java EE 規范的 Servlet 容器。Web服務器&#xff1a;類似 Nginx、Apache HTTP Server&#xff…

【Java web】HTTP 協議詳解

一、什么是 HTTP&#xff1f;—— 互聯網的 "快遞員"你有沒有想過&#xff0c;當你在瀏覽器輸入www.baidu.com并按下回車時&#xff0c;背后發生了什么&#xff1f;為什么幾秒鐘后就能看到百度首頁&#xff1f;這一切的背后&#xff0c;都離不開一個叫HTTP的 "快…

流式數據服務端怎么傳給前端,前端怎么接收?

01 引言 大模型時代&#xff0c;尤其會話模型為了提高用戶的使用體驗&#xff0c;它不會將所有的數據加載完成一次響應給客戶端&#xff0c;而是通過數據流&#xff0c;一點點的將數據慢慢呈現出來。 正是這種有趣的交互方式一次次將SSE&#xff08;Server Sent Event&#x…

ML307C 4G通信板:工業級DTU固件,多協議支持,智能配置管理

產品概述 ML307C 4G通信板是一款基于中移物聯網ML307C模組的工業級DTU&#xff08;數據傳輸單元&#xff09;產品&#xff0c;專為工業物聯網應用設計。我們的固件支持多種工業協議&#xff0c;具備遠程配置、FOTA升級、數據加密等企業級功能&#xff0c;為您的工業設備提供穩定…

Sublime配置verilog開發環境-具備語法高亮、代碼補全、自定義代碼段及語法檢查等功能,提升FPGA開發效率!

對于在學習FPGA開發之前使用過其他集成開發工具如VS、pycharm、keil或編輯工具如Sublime、VScode、Notepad的朋友&#xff0c;在使用Vivado時可能會像博主一樣感覺自帶編輯器用起來不太舒服&#xff0c;比如不支持語法高亮顯示&#xff0c;不支持代碼自動補全等功能。因次&…

18_基于深度學習的煙霧檢測識別系統(yolo11、yolov8、yolov5+UI界面+Python項目源碼+模型+標注好的數據集)

目錄 項目介紹&#x1f3af; 功能展示&#x1f31f; 一、環境安裝&#x1f386; 環境配置說明&#x1f4d8; 安裝指南說明&#x1f3a5; 環境安裝教學視頻 &#x1f31f; 二、數據集介紹&#x1f31f; 三、系統環境&#xff08;框架/依賴庫&#xff09;說明&#x1f9f1; 系統環…

【計算機網絡架構】混合型架構簡介

引言在當今數字化浪潮席卷全球的背景下&#xff0c;網絡技術正以前所未有的速度迅猛發展&#xff0c;各種網絡架構如雨后春筍般涌現。從早期簡單的總線型、星型架構&#xff0c;到后來的環型、樹型架構&#xff0c;再到如今復雜的網狀型、云計算架構等&#xff0c;每一種架構都…

Hexo 雙分支部署指南:從原理到 Netlify 實戰

Hexo 雙分支部署指南&#xff1a;從原理到 Netlify 實戰 在 Hexo 博客部署中&#xff0c;很多人會困惑于hexo d自動部署與 GitHub 手動提交的區別&#xff0c;以及如何通過雙分支結構優雅地部署到 Netlify。本文將清晰拆解兩種部署方式的核心差異&#xff0c;并手把手教你用雙分…

【數據結構】深入理解單鏈表與通訊錄項目實現

文章目錄一、單鏈表的概念及結構1.1 什么是單鏈表&#xff1f;1.2 節點的組成1.3 單鏈表的特點二、單鏈表的實現2.1 類型定義2.2 基礎工具函數1. 鏈表打印函數2. 節點創建函數2.3 單鏈表的核心操作&#xff08;1&#xff09;插入操作1. 尾插&#xff08;SLTPushBack&#xff09…

《Python學習之字典(一):基礎操作與核心用法》

堅持用 清晰易懂的圖解 代碼語言&#xff0c;讓每個知識點變得簡單&#xff01; &#x1f680;呆頭個人主頁詳情 &#x1f331; 呆頭個人Gitee代碼倉庫 &#x1f4cc; 呆頭詳細專欄系列 座右銘&#xff1a; “不患無位&#xff0c;患所以立。” Python學習之字典&#xff08;…

[安洵杯 2019]Attack

BUUCTF在線評測BUUCTF 是一個 CTF 競賽和訓練平臺&#xff0c;為各位 CTF 選手提供真實賽題在線復現等服務。https://buuoj.cn/challenges#[%E5%AE%89%E6%B4%B5%E6%9D%AF%202019]Attack流量分析題&#xff0c;瀏覽的時候發現攻擊者上傳信息頁面&#xff0c; 直接搜索 flag 就…