c++ - 使用 decltype 的动态多态类型推导

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

最佳答案

从你的问题中你的目标不清楚。无论如何,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); 
    }
};

如果您想模拟协方差,请参阅:How To Make a clone method using shared_ptr and inheriting from enable_shared_from_this

关于c++ - 使用 decltype 的动态多态类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47239782/

相关文章:

c# REST API 多态返回类型

ruby-on-rails - 在 Rails 中使用具有多态关联的 "_type"列

c++ - 比较 std::tuple_element 和 decltype(std::get) 时,std::is_same 返回 false

c++ - char数组的模板类型推导

c++ - 从 QWidget 中的 QTextEdit 获取文本

c++ - 派生类C++访问派生类的基类

c# - 为什么编译器选择了错误的方法重载?

c++ - 从转发声明的类的函数获取返回类型

c++ - z3 C++ API : get operation of expr

c++ - 异常表现不同