【发布时间】: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