0

簡単な質問です。いくつかの静的ポリモフィズム クラスがある場合

template <class Derived>
struct base
{
}

struct derived1 : public base<derived1>{
}

//do the same for derived2, derived3.

多くの派生1派生2派生3オブジェクトを含むstd::listを宣言する方法は? std::list < base > のようなものですか? 違うと思いますよね?

PS: どうやら派生クラスは実行時に選択され、実行時に派生クラスの機能にアクセスする必要があります。

どうもありがとう!

4

1 に答える 1

0

baseCRTP を使用するため、クラス テンプレートのすべてのインスタンス化に対して共通の基本クラスを定義する必要があります。

class base_base { public: virtual ~base_base() = default; };
template<typename T> class base : public base_base;

次に、追加の間接化が必要なので、 を使用する必要がありますstd::unique_ptr

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

std::list<std::unique_ptr<base>> my_list;
my_list.emplace_back(make_unique<derived1>());
my_list.emplace_back(make_unique<derived2>());
my_list.emplace_back(make_unique<derived3>());

C++14 では、ほとんどの場合 を使用できるためstd::make_unique、その関数を自分で定義する必要はありません。

于 2013-10-27T18:13:06.807 に答える