0

独自のテンプレート スワップ関数を作成しようとしていますが、このコードには何か問題があります。

template <class T>
void swap_universal(T &a, T &b) {
    T tmp = a;
    a = b;
    b = tmp;
}

この 2 行a = bb = tmp、エラーが発生しますread only variable is not assignable。Xcodeを使用しています。

UPD:それは完全なコードです:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>

using namespace std;

template <class T>
void swap_universal(T &&a, T &&b) {
    T tmp = a;
    a = b;
    b = tmp;
}

template <typename T>
void quick_Sort(const int &start, const int &end, const vector<T> &mas/*, const vector<T> arr*/) {
    int left = start, right = end;
    int middle = rand() % (end - start) + start;
    while (left < right) {
        while (mas[left] < middle)
        left++;
        while (mas[right] > middle)
            right--;
        if (left <= right) {
            swap_universal(mas[left], mas[right]);
            left++;
            right--;
        }
    }
    if (start < right)
        quick_Sort(start, right, mas);
    if (end > left)
        quick_Sort(left, end, mas);
}

int main(int argc, const char * argv[]) {
    vector<int> t;
    for (int i = 100; i >= 0; i--) {
        t.push_back(i);
    }
    quick_Sort(0, t.size() - 1, t);
}

ご覧のとおり、quick_Sort関数内で新しいスワップ関数が呼び出されます

4

1 に答える 1

0

コール サイトを見なくても、何が起こったかを推測できると思います。

一時は、変更可能な左辺値参照にバインドできません。可変 r 値参照または const 参照にバインドできます。

したがって、関数を呼び出すときに、これはコンパイルできないものの 1 つの例です。

extern Foo make_a_new_foo();
Foo f;
swap_universal(f, make_a_new_foo());

参照先を変更したいので、 const 参照は役に立ちません。したがって、本当に必要なのは、コンテキストに応じて a と b が右辺値参照または左辺値参照のいずれかであると推測するテンプレート関数です。

幸いなことに、推定コンテキストで右辺値参照構文を指定すると、c++ がこの魔法を処理してくれます (この場合、T の型は T の正しい型の選択に依存するため、推定コンテキストで T が評価されます)。

これはうまくいきます:

template <class T, class U, typename = std::enable_if_t<std::is_same<std::decay_t<T>, std::decay_t<U>>::value>>
void swap_universal(T &&a, U &&b) {
    T tmp = a;
    a = b;
    b = tmp;
}
于 2015-10-26T09:22:51.017 に答える