【问题标题】:finding the type of a templated derived class查找模板派生类的类型
【发布时间】:2018-03-30 16:51:15
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • 因为在一般情况下具体派生类型在编译时是未知的,所以您不能在需要类型的任何地方使用该类型。
  • 模板编程有什么技巧吗?
  • 模板元编程在编译时运行。不能考虑运行时信息。您要问的内容需要知道派生类型,换句话说,它回退到使用 std::tuple 或等效项。
  • 在任何情况下,您都需要任何代码的实例,该实例将使用该系统来处理每种可能的派生类型,这意味着模板化。如果您不限制可能的派生类型的数量,那么唯一可行的方法是使每个新的派生类型生成您要运行的代码的新实例。最简单的方法是简单地添加一个虚拟成员函数。在所有实际情况下,依赖于派生类型的具体类型的代码需要以某种依赖于该类型的方式进行模板化,并为每个派生类型实例化。
  • 不确定,但也许CRTP 可以帮助你

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


【解决方案1】:

要回答问题标题中所述的问题,您通常不需要这样做,您可以使用虚拟方法代替。

为了说明这如何帮助解决将正确类型传递给运算符的问题主体

向 Wrapper_base 添加公共好友函数

friend std::ostream& operator<< (std::ostream& stream, const Wrapper_base& wb)
{
    wb.ToStream(stream);
    return stream;
}

和一个纯虚函数 virtual void ToStream(std::ostream& stream) const = 0;

(可以是私人的也可以是公开的)

在模板类 Wrapper 中,实现 ToStream

virtual void ToStream(std::ostream& stream) const
{
    stream << t_;   
}

然后下面的作品

std::cout << *w[0] << ' ' << *w[1] << ' ' << *w[2];

【讨论】:

  • thanx 但是如果我想调用非多态方法怎么办?我想,我需要做正确的类型转换。
  • 我想我不明白你想要达到什么目的。假设你可以做演员,你希望代码使用它看起来像什么?
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2015-04-10
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多