2012-04-13 15 views
2

boost :: shared_ptrの基本型を抽出するテンプレートを作成しようとしています。テンプレートは派生型と基底を一致させます

私は、このテンプレートを書いた:

template<typename T> 
struct ExtractBaseType; 

template<typename T> 
struct ExtractBaseType<boost::shared_ptr<T> > 
{ 
    typedef T type; 
}; 

それはプレーンなshared_ptrのために正常に動作します。これは:

struct A 
{ 
}; 

ExtractBaseType<boost::shared_ptr<A> >::type a_thing; 
std::cout << typeid(a_thing).name() << std::endl; 

プリント "1A"です。

しかし、これはコンパイルされません:

struct B : boost::shared_ptr<A> 
{ 
}; 

ExtractBaseType<B>::type b_thing; 

コンパイラはExtractBaseTypeが定義されていないと文句を言い。

なぜですか?そして、これはどうやって行なわれるのですか?

+2

shared_ptrは基本クラスとして設計されておらず、しばしばshared_ptrは値で取られます。これは、派生クラスによって予期しない動作をする可能性があります。 shared_ptrはおそらく 'final'クラスでなければなりません。少なくとも、それをそのまま扱うべきです。 – bames53

答えて

4

shared_ptrと一致していないため、Bと一致していません。あなたはshared_ptrの派生一致する必要があります。

template<typename T, class = void> 
struct ExtractBaseType; 

template<class C> 
struct ExtractBaseType< 
    C, typename enable_if< 
      boost::is_base_of<shared_ptr<typename T::element_type>, T>::value 
     >::type 
    > 
{ 
    typedef typename T::element_type type; 
}; 

^はテストしていないが、主なアイデアは

良い質問があります。つまり、shared_ptrから継承するのは醜いようです。