我有一个包含基类指针的向量容器:
class Wrapper_base {
public:
virtual ~Wrapper_base() {}
};
template <typename T>
class Wrapper : public Wrapper_base {
private:
T t_;
public:
Wrapper(const T t) : t_(t) {}
};
Wrapper<int> a (1);
Wrapper<float> f = 2.0;
Wrapper<double> d = 3.1415;
vector<Wrapper_base*> w;
w.push_back(&a);
w.push_back(&f);
w.push_back(&d);
现在,我正在寻找一种方法来查找Wrapper函数包装的值。问题是我不知道向下转换基类指针的派生类的类型是什么。
cout << ( (Wrapper<ReturnType?>) (w[0]) ) -> t_;
有没有办法实现这个目标?我不想检查typeid值或使用dynamic_cast,因为设计应该支持一般情况而不是有限数量的类型。我也不是在寻找像std :: tuple或bost :: tuple这样的东西。
有什么建议吗?
答案 0 :(得分:0)
要回答问题标题中所述的问题,您通常不需要这样做,您可以使用虚拟方法。
为了说明这对于将正确的类型传递给operator&lt;&lt;&lt;&lt;&lt;&lt;你可以: -
将公共朋友功能添加到Wrapper_base
friend std::ostream& operator<< (std::ostream& stream, const Wrapper_base& wb)
{
wb.ToStream(stream);
return stream;
}
和纯虚函数 virtual void ToStream(std :: ostream&amp; stream)const = 0;
(您可以根据需要私下或公开)
在模板类Wrapper中,实现ToStream
virtual void ToStream(std::ostream& stream) const
{
stream << t_;
}
然后以下工作
std::cout << *w[0] << ' ' << *w[1] << ' ' << *w[2];