Mic*_*rst 6 c++ polymorphism templates
我正在设计一个Array能够容纳任何类型对象的简单类,比如可以在一个对象中保存多种类型数据的向量.(这是出于学习目的.)
我有一个名为的空基类Container:
class Container {};
Run Code Online (Sandbox Code Playgroud)
一个模板化的子类称为Object:
template <class T>
class Object : public Container {
T& object;
public:
Object(T& obj = nullptr) : object(obj) {}
};
Run Code Online (Sandbox Code Playgroud)
我有一个Array类,其中包含一个vector指向Containers 的指针,用于保存Objects:
class Array {
std::vector<Container *> vec;
public:
template <class T>
void add_element(const T&);
auto get_element(int);
};
Run Code Online (Sandbox Code Playgroud)
add_element将元素存储到Objects中并将它们放入vec:
template <class T>
void Array::add_element(const T& element)
{
vec.push_back(new Object<T>(element));
}
Run Code Online (Sandbox Code Playgroud)
get_element从中移除元素Object并将其传递回调用者.这就是我的问题所在.为了从中删除元素Object,我需要知道Object它是什么类型:
auto Array::get_element(int i)
{
return (Object</* ??? */> *)vec[i])->object;
}
Run Code Online (Sandbox Code Playgroud)
有什么方法让我找出我正在存储的对象类型?
编辑:因为人们声称这是不可能的,这是怎么回事.有没有办法在类中存储类型信息?(我知道你可以用红宝石做到这一点).如果我能做到这一点,我可以存储get_element每个的返回类型Object.
我正在为您的get_element.
template <class T>\nT& Array::get_element(int i, T &t)\n{\n\xc2\xa0 \xc2\xa0 Object<T> *o = dynamic_cast<Object<T> *>(vec[i]);\n\xc2\xa0 \xc2\xa0 if (o == 0) throw std::invalid_argument;\n\xc2\xa0 \xc2\xa0 return t = o->object;\n}\n\nArray arr;\ndouble f;\nint c;\n\narr.get_element(0, f);\narr.get_element(1, c);\nRun Code Online (Sandbox Code Playgroud)\n\n但或者,你可以使用这个:
\n\ntemplate <class T>\nT& Array::get_element(int i)\n{\n Object<T> *o = dynamic_cast<Object<T> *>(vec[i]);\n if (o == 0) throw std::invalid_argument;\n return o->object;\n}\n\nf = arr.get_element<double>(0);\nc = arr.get_element<int>(1);\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1127 次 |
| 最近记录: |