使用decltype的动态多态类型演绎

Dynamic polymorphic type deduction using decltype

本文关键字:类型 演绎 多态 动态 decltype 使用      更新时间:2023-10-16

你能给我一个提示,如何使这段代码按照我想要的方式工作吗?我希望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);
}

你的目标从你的问题中不清楚。无论如何,decltype(e)在这里的行为符合预期,因为它将返回"声明的e类型",这是在编译时已知的。

不可能

在运行时使用 decltype 检索派生类的实际类型。如果要根据多态对象的运行时类型"克隆",可以使用 virtualoverride 。例如:

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); 
    }
};

如果要模拟协方差,请参阅: 如何使用shared_ptr和从enable_shared_from_this继承创建克隆方法