使用decltype进行动态多态类型推导

时间:2017-11-11 15:48:58

标签: c++ polymorphism decltype

请您给我一个提示,如何让这段代码按照我的意愿运行?我希望derived_tDerived,但始终为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);
}

1 个答案:

答案 0 :(得分:2)

您的目标尚不明确。无论如何,decltype(e)在此处的行为与预期相同,因为它将返回“声明的e类型”,这在编译时是已知的。

使用decltype无法在运行时检索派生类的实际类型。如果要根据多态对象的运行时类型“克隆”,可以使用virtualoverride。 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