我有两个类,点和像素:
class point {
public:
point(int x, int y) : x(x), y(y) { };
private:
int x, y;
}
template <class T>
class pixel : public point {
public:
pixel(int x, int y, T val) : point(x, y), val(val) { };
private:
T val;
}
现在这是我的问题。我想创建一个容器类(让我们称之为coll),它有一个点或像素的私有向量。如果coll的实例包含像素,我希望它有一个方法toArray(),它将像素向量转换为表示向量内容的T数组。
我将继承这样做:即,我可以创建一个包含点向量的基类coll和包含额外方法的派生类,但是我似乎遇到了问题,因为像素是一个类模板。
有人有建议吗?我可以通过使coll成为类模板来实现这一点吗?
答案 0 :(得分:3)
问题:你是说私人载体同时包含点和像素,还是只包含其中一个?
问题:如果只是其中一个,您是否想在同一个私有向量中混合使用不同模板参数的像素?
假设它只是私有向量中的Point或Pixel,并且私有向量中的Pixels都具有相同的模板参数,您可以这样做:
template < class T > class CollectionBase
{
//common interface here
protected:
std::vector<T> coll_vec;
};
class PointCollection : public CollectionBase<Point>
{
public:
...
};
template< class T> PixelCollection : public CollectionBase<Pixel<T> >
{
public:
Pixel<T>* toArray();
...
};
答案 1 :(得分:1)
如果您想检查point
对象是否也是pixel<T>
的类型,那么您只需查看dynamic_cast
是否返回NULL
。为了做到这一点,point
将需要是多态的,所以添加一个虚拟析构函数。
以下是一个例子:
point x(0, 0);
pixel<int> y(0, 0, 0);
point *pX = &x;
point *pY = &y;
if(dynamic_cast<pixel<int> *> (pX) != NULL) {
std::cout << "x is a pixel<int>.";
}
if(dynamic_cast<pixel<int> *> (pY) != NULL) {
std::cout << "y is a pixel<int>.";
}
输出如下:
y是一个像素&lt; int&gt;。
您可以在coll
课程中使用此代码来检查vector<point *>
的每个元素是点还是像素。但是为了做到这一点,你需要知道存储像素的哪个特化(即它是pixel<int>
还是pixel<float>
?)
将coll
替换为类模板可能更简单。
答案 2 :(得分:1)
如果collection
将point
和pixel
视为大致相同且仅包含其中一个,则将其设为模板类是有意义的。
然而,关于to_array
,使它成为自由函数可能更简单:
template<class T> struct collection {
std::vector<point<T> > data_;
// ...
};
template<class T>
void to_array(const collection<point<T> >& in, point<T>* out) {
// ...
}
请注意,您必须提供一个公共接口,以便对数据进行读取访问,或者至少有选择地授予to_array()
访问权限。