3

別の場所に保存されているデータを 2 次元画像として扱うためのテンプレート クラスがあります。

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

基になるイメージへの読み取り/書き込みアクセス用のイテレーターと、読み取り専用アクセス用の const_iterators があり、ご想像のとおり、const メソッドは const イテレーターを返し、非 const メソッドは非 const イテレーターを返します。型が constの場合、Pixelすべてのイテレータは const イテレータです。

これによりImageWin<const int>const ImageWin<int>非常によく似たタイプになります。どちらも同じ反復子 (定数反復子) のセットを持ちます。どちらも下にあるピクセルを変更することはできません。唯一の違いは、別のImageWin<const int>場所を指すようにできることです (つまり、ウィンドウが指している場所は変更可能ですが、ピクセルはそうではありません)。

ピクセル データへの読み取りアクセスが必要な関数がある場合、次のように宣言できるようにしたいと考えています。

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

問題は、ImageWin<const int>それを渡す方法があるかどうかです。確かにテンプレート関数にすることもできますが、可能であればそれを避けようとしています。const をImageWin<Pixel>暗黙的に に変換できるようにできると考えていましたが、 a はconst ピクセルのよりも制限的であるImageWin<const Pixel>ため、実際には逆が必要です。一般に、const でない場合、ピクセルの const-ness に違反するため、変換可能にすることはできません。const ImageWinImageWinImageWin<Pixel>ImageWin<const Pixel>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 ??? */;

2 つの実装の間のロジックを自由に分解してください。これらの関数には、あらゆる種類の参照を渡すことができます。

補足として、メンバー関数の場合は、thisポインターが const であるかどうかを再確認してください。

于 2013-07-01T08:41:57.040 に答える