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が定義されていないと文句を言い。
なぜですか?そして、これはどうやって行なわれるのですか?
shared_ptrは基本クラスとして設計されておらず、しばしばshared_ptrは値で取られます。これは、派生クラスによって予期しない動作をする可能性があります。 shared_ptrはおそらく 'final'クラスでなければなりません。少なくとも、それをそのまま扱うべきです。 – bames53