読者です 読者をやめる 読者になる 読者になる

C++と色々

主にC++やプログラムに関する記事を投稿します。

型特性メタ関数

C++

例のテンプレート本(下記の参考文献参照)のSFINAEの章の勉強がてら、あるクラスが特定の基底クラスの派生クラスかどうか判定するプログラム書いてみた。
今回の場合はGundamクラスを派生してるかどうかチェックするプログラム

#include <iostream>
#include <boost/utility.hpp>
using namespace boost;
using std::cout;
using std::endl;

//基底クラス:ガンダム
class Gundam
{
};

//ガンダム派生クラス:エクシア
class Exia : public Gundam
{
};

//ガンダム派生クラス:ゴッド
class God : public Gundam
{
};

//ザク
class Zaku
{
};

//ガンダムか判定するメタ関数
template <class T>
class IsGundam
{
	static char Test(Gundam);
	static double Test(...);
	
	static T CreateT();

public:
	static const bool value = sizeof(Test(CreateT())) == sizeof(char);
};

//チェック関数
template<class T>
void Check(T value, typename enable_if<IsGundam<T>>::type* = 0)
{
	cout << typeid(value).name() << "は、ガンダムだ!!!" << endl;
}

template<class T>
void Check(T value, typename disable_if<IsGundam<T>>::type* = 0)
{
	cout << typeid(value).name() << "は、ガンダムではない!!!" << endl;
}


int main()
{
	Check(Gundam());//ガンダム
	Check(Exia());//ガンダム
	Check(God());//ガンダム
	Check(Zaku());//ガンダムではない
	Check(int());//ガンダムではない
	return 0;
}

実行結果

class Gundamは、ガンダムだ!!!
class Exiaは、ガンダムだ!!!
class Godは、ガンダムだ!!!
class Zakuは、ガンダムではない!!!
intは、ガンダムではない!!!
続行するには何かキーを押してください . . .

enable_ifの実装も本に書いてあってそれも書いてみたかったけど、ソース長くなって見づらくなりそうだから大人しくboostのものを使用した。

参考文献
επιστημη、高橋 晶:"C++テンプレートテクニック"、SoftBankCreative(2009)

"templateの T が IBase を継承してることを保証させるには":http://www.freeml.com/cppll/13669/latest(2012/6/24アクセス)