使用decltype的动态多态类型演绎
Dynamic polymorphic type deduction using decltype
你能给我一个提示,如何使这段代码按照我想要的方式工作吗?我希望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
检索派生类的实际类型。如果要根据多态对象的运行时类型"克隆",可以使用 virtual
和 override
。例如:
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继承创建克隆方法
相关文章:
- 类型演绎 C++ 标准和自动
- λ类型演绎失败
- decltype(auto) 类型演绎:返回 x 与返回 (x)
- 使用decltype的动态多态类型演绎
- 普遍类型演绎scott-meyers
- c++ 11使用std::函数进行类型演绎
- 使用通用引用时进行类型演绎
- c++如何在无法进行类型演绎时调用模板化构造函数
- c#泛型中的类型演绎类似于c++模板
- 类型演绎不适用于std::function
- 为什么decltype返回类型在递归模板中失败,而返回类型演绎却工作得很好?
- 表达式模板中的按引用捕获可以与类型演绎共存
- 类型演绎模板函数c++
- 模板,类型演绎不足
- 括号初始化列表和函数模板类型演绎顺序
- 类型演绎的重载赋值操作符
- 静态方法中派生类的类型演绎
- 在类型演绎之后,函数模板中的替换顺序是否有任何保证
- 返回类型演绎是否可能
- c++ 14中赋值时的返回类型演绎