找到模板化派生类的类型

时间:2017-10-18 18:07:11

标签: c++ pointers polymorphism downcast template-deduction

我有一个包含基类指针的向量容器:

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这样的东西。

有什么建议吗?

1 个答案:

答案 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];