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

C++ 模板類別成員函式模板實現隱式轉換

     編輯:關於C++

問題

模板具現化型別之間無隱式轉換關係(SmartPtr<Derived> 不能隱式轉 SmartPtr<Base>),需自行提供轉換建構函式。

解決:成員函式模板建構函式

template<typename T>
class SmartPtr {
public:
    SmartPtr() = default;
    template<typename U>
    SmartPtr(const SmartPtr<U>& other) : heldPtr(other.get()) {
        cout << "SmartPtr:CopyConstructor" << endl;
    }
    T* get() const { return heldPtr; }
private:
    T* heldPtr;
};

限制轉換方向

僅允許 Derived* 隱式轉 Base*,利用 other.get() 隱式轉換在成員初始化列表中由編譯器檢查。若 U* 不可轉 T*,編譯失敗。

程式碼

/* test.cpp
 * Created on: 2014.04.20
 * Author: Spike
 */
#include <iostream>
using namespace std;

class Base{};
class Derived : public Base {};

template<typename T> class SmartPtr {
public:
    SmartPtr() = default;
    template<typename U>
    SmartPtr(const SmartPtr<U>& other) : heldPtr(other.get()) {
        cout << "SmartPtr:CopyConstructor" << endl;
    }
    T* get() const { return heldPtr; }
private:
    T* heldPtr;
};

int main() {
    SmartPtr<Derived> spd;
    SmartPtr<Base> spb(spd);           // OK:Derived* -> Base*
    // SmartPtr<Derived> spd2(spb);    // 錯誤:Base* 不能轉 Derived*
    SmartPtr<Base> spb2;
    SmartPtr<Base> spb3(spb2);         // 同型別,使用預設複製建構
    return 0;
}

輸出

SmartPtr:CopyConstructor

注意

  • 成員函式模板建構函式不會抑制編譯器產生預設複製建構函式。
  • 搭配 std::enable_if 或 C++20 Concepts 可更精確限制轉換條件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved