【发布时间】:2019-03-31 05:55:26
【问题描述】:
我有一个Wrapper<T> 模板类。
我有一个基类 A。
我有一个派生类 B:public A。
我想要的是将Wrapper<B> 存储在vector<Wrapper<A>> 中。
我知道这在技术上是不对的,因为 Wrapper<B> 不是 Wrapper<A> 的直接子类
但不知何故,STL 允许 shared_ptr 这样做:
#include <memory>
#include <vector>
#include <iostream>
struct A
{
A() {}
virtual ~A() {}
virtual void print() { std::cout << "A" << std::endl; }
};
struct B : public A
{
B() {}
virtual ~B() {}
virtual void print() { std::cout << "B" << std::endl; }
};
int main()
{
std::vector<std::shared_ptr<A>> v;
v.push_back(std::make_shared<A>());
v.push_back(std::make_shared<B>());
for (auto &e : v)
e->print();
return 0;
}
我怎样才能为我的Wrapper<T> 类实现相同的结果?
这是非编译代码:
#include <vector>
#include <iostream>
template <class T>
struct W
{
};
struct A
{
A() {}
virtual void print() { std::cout << "A" << std::endl; }
};
struct B : public A
{
B() {}
virtual void print() { std::cout << "B" << std::endl; }
};
int main()
{
std::vector<W<A>> v;
v.push_back(W<A>());
v.push_back(W<B>());
for (auto &e : v)
e->print();
return 0;
}
最好, 皮埃尔
【问题讨论】:
-
"我有一个 Wrapper 模板类。" 它是如何定义的?你想要什么功能?
-
一个
Bis-aA,你不需要shared_ptr<B>,一个shared_ptr<A>可以容纳一个B实例。如果您需要这种区别,我会闻到糟糕的设计。 -
显示问题的邮政编码。
-
@AlgirdasPreidžius Wrapper 是为了让问题保持简单而进行的简化。在我的真实世界用例中,我有一个 vector
包含 Product 和 ProductDerivative 对象(产品导数是 Product 的子类)。 -
代码in your question应该显示问题。将该代码放入问题中,而不是有效的代码。
标签: c++ c++11 templates casting shared-ptr