请您给我一个提示,如何让这段代码按照我的意愿运行?我希望derived_t
为Derived
,但始终为Base
。
#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);
}
答案 0 :(得分:2)
您的目标尚不明确。无论如何,decltype(e)
在此处的行为与预期相同,因为它将返回“声明的e
类型”,这在编译时是已知的。
使用decltype
无法在运行时检索派生类的实际类型。如果要根据多态对象的运行时类型“克隆”,可以使用virtual
和override
。 E.g:
struct Base {
// ...
virtual std::shared_ptr<Base> clone() {
return std::make_shared<Base>(*this);
}
};
struct Derived : Base {
// ...
virtual std::shared_ptr<Base> clone() {
return std::make_shared<Derived>(*this);
}
};
如果您想模拟协方差,请参阅:How To Make a clone method using shared_ptr and inheriting from enable_shared_from_this