我有一个名为 ABC 的类,它有一个类模板:
template <class T> class ABC{}
在另一个类中,我试图将对象 ABC 存储在列表中:
class CDE{
private:
list<ABC *> some_list;
}
我打算存储可能具有不同类模板参数的 ABC 对象。是否有必要在编译时为指针指定模板?如果容器应该存储不同类型的对象怎么办?那不可能吗?
我有一个名为 ABC 的类,它有一个类模板:
template <class T> class ABC{}
在另一个类中,我试图将对象 ABC 存储在列表中:
class CDE{
private:
list<ABC *> some_list;
}
我打算存储可能具有不同类模板参数的 ABC 对象。是否有必要在编译时为指针指定模板?如果容器应该存储不同类型的对象怎么办?那不可能吗?
是否有必要在编译时为指针指定模板?
是的。
如果容器应该存储不同类型的对象怎么办?那不可能吗?
这是(直接)不可能的。
没有 ABC 类这样的东西。只有 ABC 的实例化,例如ABC<Foo>
和ABC<Bar>
。这些是完全不同的类。
您可以执行以下操作:
template<typename T>
class ABC : public ABC_Base
{
...
}
list<ABC_Base*> some_list;
通过这样做,您的所有 ABC 实例都有一个共同的基类型,并且您可以任意使用基指针。
您需要在CDE
类中指定模板参数,或者CDE
还需要制作模板。
第一个选项:
class CDE {
private:
list< ABC<int>* > some_list;
};
第二种选择:
template <class T>
class CDE {
private:
list< ABC<T>* > some_list;
};
该列表只能存储一种类型。模板的不同实例是不同的类型。如果这令人满意,您可以这样做:
template <class T> class CDE{ private: list<ABC<T> *> some_list; }
如果您需要使用不同的类型,也许您可以为 ABC 创建一个非模板基类并存储指向它的指针。(即使用接口)