我有一个模板类,用于将存储在别处的数据视为二维图像。
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>
不是常量,则会违反像素的常数。
我有什么诡计吗?
感谢。
答案 0 :(得分:0)
为什么不简单地超载呢?
void needs_read_only( const ImageWin<Pixel>& image ) /* const ??? */;
void needs_read_only( const ImageWin<const Pixel>& image ) /* const ??? */;
随意分解两个实现之间的逻辑。您可以将任何类型的引用传递给这些函数。
作为旁注,如果它们是成员函数,请仔细检查this
指针是否应该是const。