1

基本クラスとその階層がある場合:

class BaseClass {
}

class DerivedClass : public BaseClass {
}

テンプレート化されたクラス:

template <class T> struct TemplatedClass {
}

どうすればこれを達成できますか? :

// 1:
void doSomething(TemplatedClass<BaseClass *> const &t);

// 2:
std::vector<TemplatedClass<BaseClass *>> v;

TemplatedClass<DerivedClass *> a;

// Doesn't compile
doSomething(a);

// Doesn't compile
v.push_back(a);
4

2 に答える 2

2

テンプレート化されたクラスにも階層を持たせることができます。ただし、ベースを指定する必要があります。

template <typename...>
struct TC;

template <>
struct TC<> {
    virtual ~TC() {}
};
template <typename T, typename... B>
struct TC
    : TC<B...> {
    // ...
};

継承の可変引数を使用すると、テンプレート間の関係を指定して、基になるテンプレートの継承階層を模倣できるようになります。例えば:

TC<Base>* d = new TC<Derived, Base>(/*...*/);
于 2013-11-08T14:18:18.310 に答える
1

それらは独立した型であるTemplatedClass<DerivedClass*>ため、 に変換可能にする必要があります。TemplatedClass<BaseClass *>最善の方法は、次のようなコンストラクターを使用することです。

template <class T> struct TemplatedClass {
    template<class P> TemplatedClass( const TemplatedClass<P> &an );
};

スマート ポインターのようなものを作成しようとしているように見えstd::shared_ptrますboost::shared_ptr。このコードを本番環境で使用したり、チームと共有したりする予定がある場合は、この ctor に渡されるデータ型に追加のチェックを入れることができます。

template <class T> struct TemplatedClass {
    template<class P, class = typename std::enable_if<std::is_convertible<P, T>{}>::type>
    TemplatedClass( const TemplatedClass<P> &an );
};

繰り返しになりますが、最善の方法は、のソースを調べて、shared_ptrそこでどのように行われるかを確認することです。

于 2013-11-08T14:08:53.863 に答える