【发布时间】:2012-07-06 22:14:04
【问题描述】:
我正在设计一个简单的Array 类,它能够保存任何类型的对象,例如可以在一个对象中保存多种类型数据的向量。 (这是为了学习目的。)
我有一个名为Container 的空基类:
class Container {};
还有一个名为Object的模板化子类:
template <class T>
class Object : public Container {
T& object;
public:
Object(T& obj = nullptr) : object(obj) {}
};
我有一个Array 类,它包含一个指向Containers 的指针vector,我用它来保存Objects:
class Array {
std::vector<Container *> vec;
public:
template <class T>
void add_element(const T&);
auto get_element(int);
};
add_element 将元素存入Objects 并放入vec:
template <class T>
void Array::add_element(const T& element)
{
vec.push_back(new Object<T>(element));
}
get_element 从它的Object 中删除元素并将其传递回调用者。这就是我的问题所在。为了从Object 中删除元素,我需要知道Object 是什么类型:
auto Array::get_element(int i)
{
return (Object</* ??? */> *)vec[i])->object;
}
有什么方法可以让我找出我存储的对象类型吗?
编辑:既然人们声称这是不可能的,那么这个怎么样。是否有某种方法可以在类中实际存储类型信息? (我知道你可以在 ruby 中做到这一点)。如果可以的话,我可以在每个Object 中存储get_element 的返回类型。
【问题讨论】:
-
@ildjarn:由于 OP 在问题中使用
auto,我认为可以安全地假设。 -
@user315052 因为那样使用会更难。 @ildjarn 是的,但如果我
decltype(vec[i])我只会得到Container *。我需要知道它是什么子类。 -
去看看boost::any
-
@MichaelDorst 编辑:既然人们声称这是不可能的,那么这个怎么样。是否有某种方法可以在类中实际存储类型信息? (我知道你可以在 ruby 中做到这一点)。如果我能做到这一点,我可以将 get_element 的返回类型存储在每个 Object 中。在 Object 类中,您可以通过 typedef 保存模板参数,例如typedef T object_type;但它不能帮助你。
-
@ForEveR 如何存储类型信息?这只能工作一次(你不能将多个类型定义为同一个标识符,例如
typedef T obj_type; ... typedef Q obj_type;),我需要它来处理我添加到Array的每个元素。
标签: c++ templates polymorphism