適当なクラスにある特定のメンバーがあるかないかで処理を切り分ける

に習う感じでやるのがよいか。SFINAE〜って奴です。


ここではToStringというintを引数にとってstd::stringを返すメンバーが任意のクラスにあるかないかで処理を切り分けるような書き方を書いた。

#include <iostream>
#include <string>
//ToStringクラスがあるかないかを判定する構造体(クラス)
template<typename T_>
struct HasToStringMethod
{
	template<typename U_, std::string(U_::*)(int) const> struct SFINAE {};
	template<typename U_> static char Test(SFINAE<U_, &U_::ToString> *);
	template<typename U_> static int  Test(...);
	static const bool value = sizeof(Test<T_>(0)) == sizeof(char);
};
//お試しの呼び出し
template<class T_>
void call(T_ t, std::true_type){ std::cout << "There is ToString method." << std::endl; }
template<class T_>
void call(T_ t, std::false_type){ std::cout << "There is no ToString method." << std::endl; }
template<class T_>
void call(T_ t){ call(t, std::integral_constant<bool, HasToStringMethod<T_>::value>()); }
//ToStringメソッドのある/ないHogeクラス
class HogeWithToString
{
public:
	std::string ToString(int x)const{ return std::to_string(x); }
};
class Hoge{};

int main() 
{
	call(Hoge());
	call(HogeWithToString());
	return 0;
}

実行結果

There is no ToString method.
There is ToString method.

SFINAEってもんがあんまよくわかってない時に書いたもの