2012-01-05 11 views
4

私はstd::map/std::unordered_mapのようなインタフェースを持つコンテナクラスを維持しています。std :: pairでのC++のconst正当性

インターフェイスがstd::pair<const X,Y>(つまり、value_typeのもの)を格納すると主張しています。しかし、内部的には、実装はstd::pair<X,Y>のソートされた配列を格納します。

現在の実装では、reinterpret_castを使用してイテレータを実装しています。私の質問は、より良い選択肢はありますか?

std::pair<const X,Y>の配列の格納に移動することはできません。実装では、挿入および削除を実装するために配列内の要素をコピーする必要があるためです。これを行う方法の1つはstd::sortを使用しています。


編集:私はreinterpret_castは未定義の動作起動すると信じていますが、私はこれが動作しないコンパイラに遭遇することは至っていない - 私は何も気にせAM(または実装が定義されましたか?)?イテレータの間接参照の


現在の実装:

template <class K, class M> 
std::pair<const K,M>& operator*() { 
    std::pair<K,M>& result = ...; 
    return *reinterpret_cast<std::pair<const K,M>*)(&result); 
} 
+0

私はこれを試していませんが、const_castはreinterpret_castよりも優先されませんか? – Benj

+1

@Benj 'const_cast'はここで仕事をすることができません。 –

+0

内部constを使用できないのはなぜですか?おそらく、割当を破壊/再建に変更することはできますか? –

答えて

2

私はあなたがstd::pairを返すことによってこの問題を解決することはできませんと信じています。その代わりに、が標準ペアのようなと思われるプロキシオブジェクトを返す必要がありますが、secondメンバーを更新すると、メインコンテナに伝播します。一方、最初のメンバーは希望通りにconstとして公開されます。

+0

OPに似たプロジェクトを持っていて、これはあなたが鳴らすほど簡単ではないようです。たぶん。私はそれに渦を立てます。 –

+0

http://stackoverflow.com/questions/3638541では、 'std :: pair (第1、第2)'という全く異なるオブジェクトを返すというアイデアを示しています。 –

1

「より良い代替品ですか?」 reinterpret_castで何が問題になっていますか?この場合、互換性のある(実際は同一の)表現を持つオブジェクト間でキャストしているので、キャストは明確に定義されています。

関連する問題