3

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

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>进去吗?我当然可以使它成为一个模板函数,但如果可能的话,我会尽量避免这种情况。我在想我可以让 constImageWin<Pixel>隐式转换为ImageWin<const Pixel>,但我实际上想要相反的,因为 aconst ImageWinImageWinconst 像素的 a 更具限制性。一般来说,我无法ImageWin<Pixel>转换为,ImageWin<const Pixel>因为如果不是 const,那将违反像素的 const-ness ImageWin<Pixel>

有什么我缺少的技巧吗?

谢谢。

4

1 回答 1

0

为什么不简单地超载呢?

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

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

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

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

于 2013-07-01T08:41:57.040 回答