3
template< class T1, class T2 >
class Pair {
    T1 first;
    T2 second;
};

最初の要素が 2 番目の要素になり、2 番目の要素が最初の要素になるように swap() メソッドを作成するように求められています。私は持っている:

Pair<T2,T1> swap() {
    return Pair<T2,T1>(second, first);
}

しかし、これはスワップではなく新しいオブジェクトを返します。これは、独自のデータ メンバーを変更する void メソッドである必要があると思います。T1 と T2 は潜在的に異なるクラス タイプであるため、これを行うことは可能ですか? つまり、temp=first、first=second、second=temp を単純に設定することはできません。これは、それらを異なる型に変換しようとするためです。型の順序を変更するテンプレート オブジェクトが必要になる可能性がある理由はわかりませんが、それは混乱を招くように見えますが、それは私が求められていることのようです。

編集:答えてくれてありがとう!私が考えたように、その場でスワップすることは明らかに意味がありません。swap() 関数の要求は非常にあいまいでした。

4

3 に答える 3

8

と が同じタイプである必要はないため、 in-place を交換することはできません。とは違うタイプです。元のオブジェクトとは異なるタイプのオブジェクトを返す必要があるため、それは新しいオブジェクトでなければなりません。T1T2Pair<T1,T2>Pair<T2,T1>

私がすることはこれです:

template< class T1, class T2 >
Pair<T2,T1> swap(const Pair<T1,T2>& pair) {
    return Pair<T2,T1>(pair.second, pair.first);
}

Pair(これをテンプレートのメンバーにする理由はありません。)

ただし、 whenとare が同じ型のオーバーロードを追加することもできます。T1T2

template< class T >
Pair<T,T>& swap(Pair<T,T>& pair) {
    using std::swap;
    swap(pair.first, pair.second);
    return pair;
}

しかし、デニスがコメントで述べたように、これは実際には非常に混乱を招く可能性があります。

別のアイデアは、テンプレートの変換コンストラクターPairを定義して、暗黙的に変換可能な型を交換できるようにすることです。

template< class T1, class T2 >
class Pair {
    T1 first;
    T2 second;
    template< class A1, class A2 >
    Pair(const A1& a1, const A2& a2) : first(a1), second (a2) {}
};

次に、次のように交換できます。

Pair<int,double> p1(42,47.11);
Pair<double,int> p2(p1.second,p1.first);

ただし、これはおそらく望ましくない他の暗黙的な変換もサポートしていることに注意してください。

Pair<char,float> p3(p1.second, p1.first); // narrowing! 
于 2010-05-10T18:44:12.213 に答える
2

スワップは、T1 を T2 にキャストできる場合、およびその逆の場合にのみ可能です。可能であれば、あなたは書くことができます

T2 temp (first);
first = T1(second);
second = temp;

(この関数でa*thisから aPair<T1,T2>に変更することはできません。)Pair<T2,T1>void

于 2010-05-10T18:44:52.180 に答える
1

As pair <T1,T2> and pair <T2,T1> are different types you cannot use swap on it. Swap itself also doesn't do much more than using a temporary variable when a build-in swap operation is not given (e.g. at std::vector has one). Howeyer you can create a new type using references. Or you use pointers, where copying is cheap.

    std::pair<int, float> a = std::pair <int, float> (3,3.5);
    std::pair<const float &, const int&> b = std::pair<const float &, const int&> (a.first, a.second);
于 2010-05-10T18:51:03.670 に答える