私はそれを私が望むように動作させるためにこのコードを作るためのヒントを教えてください。 derived_t
はDerived
になりますが、それは常にBase
です。decltypeを使用した動的多型式の控除
#include <iostream>
#include <string>
#include <memory>
struct Base {
virtual std::string me() { return "Base"; }
};
struct Derived : Base {
virtual std::string me() override { return "Derived"; }
};
void foo(std::shared_ptr<Base> ptr) {
using derived_raw_t = decltype(*ptr);
using derived_t = std::remove_reference<derived_raw_t>::type;
derived_t* x = new derived_t();
std::cout << x->me() << std::endl;
}
int main() {
std::shared_ptr<Base> ptr = std::make_shared<Base>(Derived());
foo(ptr);
}
を 'decltype'は、この場合、' Base'ある静的(コンパイル時)型を推論します。ファクトリ仮想関数を 'Base'クラスに追加して、このクラスのインスタンスを生成し、それを呼び出して' Derived'のファクトリメソッドを呼び出す 'x'を生成し、' Derived'型の新しいインスタンスを作成することができます。 – VTT
'foo'で派生型が必要なのはなぜですか?あなたは何を達成しようとしていますか? –
これはコンパイル時の機能であるため、 'decltype'を介して行うことはできません。あなたの最善の策は、さまざまな派生クラスでオーバーライドされたベースに 'virtual'関数' create() 'を用意して、それぞれの型のオブジェクトを作成することです。通常、コピーが必要で、対応する関数の名前は 'clone()'です。 –