型Tから型Uへの変換が存在するかどうかを調べるtemplateの手法
155 名前: デフォルトの名無しさん [sage] 投稿日: 2007/07/30(月) 08:17:11
型Tから型Uへの変換が存在するかどうかを調べるtemplateの手法ってありますか?
具体的には次のようなことをやりたいのですが…
template<typename T> struct PtrWrapper { T* p; }; class A {...}; class B : public A {...}; PtrWrapper<A> a; PtrWrapper<B> b; a = b; // 可能 b = a; // 不可能
156 名前: デフォルトの名無しさん [sage] 投稿日: 2007/07/30(月) 11:44:19
template <typename T, typename U> class Conversion { typedef char Small; class Big { char dummy[2]; }; static Small Test(U); static Big Test(...); static T MakeT(); public: enum { exists = sizeof(Test(MakeT())) == sizeof(Small) }; }; int main() { using namespace std; cout << Conversion<double, int>::exists << endl << Conversion<char, char*>::exists << endl << Conversion<size_t, vector<int> >::exists << endl << Conversion<A*, B*>::exists << endl << Conversion<B*, A*>::exists << endl; }
詳しくは Modern C++ Design 参照。
160 名前: デフォルトの名無しさん [sage] 投稿日: 2007/07/31(火) 00:30:10
>>156
ありがとう!
ていうか解説読んで感動しました…
161 名前: デフォルトの名無しさん [sage] 投稿日: 2007/07/31(火) 09:22:22
>160
どうせ中では同じようなことをやってるはずだけど、使えるなら Boost TypeTraits を使うのが楽。この場合は is_convertible