你能給我一個提示,如何使這段代碼工作,因爲我想要它?我想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'類中以生成該類的一個實例,並調用它來創建'x'調用'Derived'的工廠方法並創建一個Derived'類型的新實例。 – VTT
爲什麼你需要'foo'中的派生類型?你想達到什麼目的? –
你不能通過'decltype'來做到這一點,因爲這是一個編譯時設施。最好的辦法是在基類中重寫的基類中提供一個'virtual'函數'create()'來創建相應類型的對象。通常,需要一個副本,相應的函數名稱爲clone()。 –