型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