有没有办法让这些密切相关的类型可以互操作?

时间:2013-06-19 14:42:34

标签: c++ templates

我有一个模板类,用于将存储在别处的数据视为二维图像。

template <typename Pixel>
class ImageWin {
   ...
};

它具有用于对底层映像进行读/写访问的迭代器和用于只读访问的const_iterators,正如您所期望的那样,const方法返回const迭代器,而非const方法返回非const迭代器。如果Pixel类型是const,那么所有迭代器都是const迭代器。

这会使ImageWin<const int>const ImageWin<int>非常相似。它们都具有相同的迭代器集(const迭代器)。没有人可以修改基础像素。唯一的区别是ImageWin<const int>可以指向其他地方(即窗口指向的位置是可变的,但像素不是)。

如果我有一个需要对像素数据进行读访问的函数,我希望能够声明如下内容:

void needs_read_only( const ImageWin<int>&  image );

问题是,有没有办法将ImageWin<const int>传递给它?我当然可以使它成为模板函数,但我试图尽可能避免这种情况。我当时认为我可以使const ImageWin<Pixel>隐式转换为ImageWin<const Pixel>,但实际上我想反过来,因为const ImageWin比const ImageWin更具限制性。一般情况下,我无法将ImageWin<Pixel>转换为ImageWin<const Pixel>,因为如果ImageWin<Pixel>不是常量,则会违反像素的常数。

我有什么诡计吗?

感谢。

1 个答案:

答案 0 :(得分:0)

为什么不简单地超载呢?

void needs_read_only( const ImageWin<Pixel>&  image ) /* const ??? */;

void needs_read_only( const ImageWin<const Pixel>&  image ) /* const ??? */;

随意分解两个实现之间的逻辑。您可以将任何类型的引用传递给这些函数。

作为旁注,如果它们是成员函数,请仔细检查this指针是否应该是const。