C++-テンプレートクラスメンバー関数テンプレート(member function template)を使用した暗黙変換の処理


テンプレートクラスメンバー関数テンプレート(member function template)を使用して暗黙的な変換を処理
本住所:http://blog.csdn.net/caroline_wendy/article/details/24233693
ポインタは暗黙的な変換(implicit conversion)をサポートし、動的バインドでは派生クラスポインタをベースクラスポインタに変換することができる.
しかしテンプレートのインスタンス化(instantiations)の間には、単独で存在し、
派生クラスのインスタンス化テンプレート(SmartPtr)は、ベースクラスのインスタンス化テンプレート(SmartPtr)に変換できません.
明確な記述が必要である、派生クラスもベースクラスとして継続することができ、派生クラスを生成するので、構造関数を直接書くことはできない.
メンバー関数テンプレート(member function template)を使用して、テンプレートパラメータを宣言し、この暗黙的な変換を提供する.
変換は「Derived->Base」のような変換可能なポインタでのみ発生するため、逆順はできないため、相関制約を導入して変換可能か否かを判断する.
メンバー初期化リスト(member initialization list)でget()関数を呼び出し、暗黙的に変換できるか否かを判断する.
メンバー関数テンプレートを使用するコンストラクション関数は、メンバー関数の一種であり、レプリケーションコンストラクション関数を再ロードするわけではないので、クラスは自動的にデフォルトコンストラクション関数を生成します.
コード注意:1つ目は変換可能で、2つ目は変換できません.3つ目はデフォルトの構造関数を使用します.
コード:
/*
 * test.cpp
 *
 *  Created on: 2014.04.20
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#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()) {
		std::cout << "SmartPtr:CopyConstructor" << std::endl;
	}
	T* get() const {return heldPtr;}
private:
	T* heldPtr;
};

int main() {

	SmartPtr<Derived> spd;
	SmartPtr<Base> spb(spd);

	//SmartPtr<Base> spb1;
	//SmartPtr<Derived> spd1(spb1); //        

	SmartPtr<Base> spd2;
	SmartPtr<Base> spd21(spd2); //           
	return 0;
}

出力:
SmartPtr:CopyConstructor

C++ - 模板类使用成员函数模板(member function template)处理隐式(implicit)转换_第1张图片