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 が定義されていないと文句を言います。

なんでそうなの?そして、これはどのように行われますか?

4

1 に答える 1

4

一致していないため、機能しませshared_ptrB。の派生物と一致する必要があります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は醜いようです。

于 2012-04-13T17:40:15.447 に答える