【发布时间】:2011-03-31 10:15:56
【问题描述】:
问题,因为我对向量和模板做得不多。
如果我有一个类 foo,它是模板类,并且我想创建一个 foo 指针向量而不考虑 foo 类型,那么语法是什么样的?
【问题讨论】:
问题,因为我对向量和模板做得不多。
如果我有一个类 foo,它是模板类,并且我想创建一个 foo 指针向量而不考虑 foo 类型,那么语法是什么样的?
【问题讨论】:
没有直接的方法可以做到这一点。同一模板的不同实例被视为不同的类,彼此没有关系。
如果您想统一对待它们,一种选择是创建一个基类,然后模板foo 类从该基类继承。例如:
class foo_base {
/* ... */
};
template <typename T> class foo: public foo_base {
/* ... */
};
现在,您可以创建一个vector<foo_base*> 来存储指向foo_base 对象的指针,这些对象又是foo 的所有特化。
【讨论】:
你不会的。类模板foo(例如foo<int>、foo<char> 等)的每个实例化都是一个不同的类型。 foo 本身不是类型。
您需要为它们提供一些基类并存储指针,利用多态性。
【讨论】:
不可能。当您在任何地方使用类模板时,您需要在类型上实例化它。
一种规避方法是为foo 提供多态接口基类,并拥有这些指针的向量。
class IFoo{
virtual void bar() = 0;
virtual int baz() = 0;
};
template<class T>
class Foo : IFoo{
// concrete implementations for bar and baz
};
// somewhere in your code:
std::vector<IFoo*> vecFoo.
vecFoo.push_back(new Foo<int>);
明显的问题是,您不需要知道 bar 和 baz 函数的每个可能的返回值。
【讨论】:
您不能拥有foo<?> 的向量。编译器在创建向量时需要准确知道它存储的类型,因为foo<?> 的每个实例化都可能具有不同的大小和完全不同的成员(因为您可以提供显式和部分特化)。
您需要给foo<T> 一个公共基类,然后将baseclass 指针放入向量中(最好使用shared_ptr 或类似的东西)。
作为替代方案,有现成的类可以对您隐藏它并充当引用容器。其中有boost::ptr_vector,不过也需要一个通用的类型来存储。
class common_base {
/* functions to access the non-templates parts of a foo<T> .. */
};
template<typename T> class foo : public common_base { };
【讨论】:
如果您试图在不指定 T 的情况下模拟概念:“指向 Foo 的指针向量”,那么您正在尝试模拟当前标准不支持的模板类型定义。
解决方法是
template <class T>
my_vector
{
typedef std::vector<Foo<T>*> type;
}
如果相反,你可以为你的 Foo 人买得起多态接口,我会按照已经建议的那样做。
【讨论】: