4

C++ では、次のコードをコンパイルします。

std::pair <int, int>  x;
static_cast <std::pair <const int, int>*> (&x);

エラーが発生します:

error: invalid static_cast from type ‘std::pair<int, int>*’ to type ‘std::pair<const int, int>*’

テンプレートパラメーターリストの型をcv修飾すると、原則として「互換性のない」結果が得られるため、なぜそれが起こるのかを多かれ少なかれ理解しています。この場合、そうでなくても、コンパイラはそれを知る方法がありません。

とにかく、この変換を実行する非ハックな方法はありますか? reinterpret_cast以前はタイプパニングの問題を抱えていたので、何にでも使用することに警戒しています。また、これはパフォーマンスが重要なコードであるため、一時的に使用することはできません。

編集:

これが私がやっていることです。と互換性のあるカスタム コンテナ インターフェイスを実装していますstd::unordered_map。そのため、 であるvalue_type必要がありますpair <const key_type, mapped_type>。いくつかの最適化のために、値を、なしで内部的に保存する必要があります。ただし、そうすると、値への参照を返す必要があり、これらの非定数ペアへの参照しかないため、コンテナーにイテレーターを ( なしで) 実装することはできません。pair <key_type, mapped_type>constreinterpret_cast

4

2 に答える 2

1

これはキャストではありませんが、次のことができます。

std::pair<int, int>  x;
std::pair<const int, int> y( x );

これは、§20.2.2/4 に従って機能するはずです。

于 2010-09-03T18:36:12.447 に答える
0

これはどう:

template< typename T1, typename T2 >
struct ref_pair {
public:
    typedef const T1 first_type;
    typedef T2 second_type;

    ref_pair(first_type& f, second_type& s) : f_(f), s_(s) {}

    first_type& first() {return *f_;}
    second_type& second() {return *s_;}
private:
    first_type* f_;
    second_type* s_;
};

私は知っています、それは違います、それらは関数です。あなたが本当に必死なら、あなたは遅延評価とを行ういくつかのプロキシタイプのオブジェクトにfirst変えることができます。 ただし、最終的には、ユーザーが違いを判断できる方法が常にあります。second*f_*s_


reinterpret_castもちろん、何も保証されていませんが、以下はかなり安全でポータブルだと思います。

std:::pair<const int,int>& rx = reinterpret_cast<std:::pair<const int,int>&>(x);

でも汚い感じがします。手を洗います。

于 2010-09-03T19:43:49.587 に答える