Member Function Templates(成員函數模板) 是 C++ 強大特性,允許在類模板內部定義模板成員函數。本文通過智能指針繼承轉換場景,演示其解決「模板實例化類型間無隱式轉換」問題的經典用法。
類層次結構:
class MusicProduct { virtual void play() = 0; };
class CD : public MusicProduct { ... };
class MP3 : public MusicProduct { ... };
智能指針模板:
template
class SmartPtr {
T* pointee;
public:
explicit SmartPtr(T* p = nullptr) : pointee(p) {}
T* operator->() const { return pointee; }
T& operator*() const { return *pointee; }
};
使用場景:
void displayAndPlay(const SmartPtr& pmp, int times);
SmartPtr cdMusic(new CD("Beyond Live"));
SmartPtr mp3Music(new MP3("Beyond MP3"));
displayAndPlay(cdMusic, 10); // 編譯錯誤!
displayAndPlay(mp3Music, 10); // 編譯錯誤!
錯誤原因:SmartPtr 和 SmartPtr 是兩個完全無關的類型,不存在隱式轉換關係。
template
class SmartPtr {
T* pointee;
public:
// ... 現有代碼 ...
// 關鍵:成員函數模板轉換操作符
template
operator SmartPtr() const {
return SmartPtr(pointee); // 隱含 T* → NewType* 上行轉換
}
};
SmartPtr 與目標 const SmartPtr& 不匹配SmartPtr 中尋找轉換操作符operator SmartPtr() NewType = MusicProduct 實例化模板pointee (CD*) 能否隱式轉換為 MusicProduct* → 合法(公有繼承)| 編譯器 | 支持版本 | 備註 |
|---|---|---|
| GCC | 3.0+ | 完整支持 |
| Clang | 所有版本 | 完整支持 |
| MSVC | VS 2005+ (8.0+) | VC6 不支持,會忽略該模板導致編譯失敗 |
| Intel ICC | 9.0+ | 完整支持 |