Как обеспечить swap () для класса в глобальном пространстве имен? - PullRequest
3 голосов
/ 19 апреля 2019

Для класса в пространстве имен правильным способом предоставления swap() является определение свободной функции в этом пространстве имен (например, Как перегрузить std :: swap () ).Но что является лучшим методом для класса, который находится в глобальном пространстве имен?

У cppreference есть пример со свободной swap() функцией в глобальном пространстве имен.
Но этоЕдинственное место, где я видел, что сделано, и я волнуюсь, что это был просто недосмотр.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

Как правило, ни одна библиотека не должна использовать глобальное пространство имен, только основное приложение.И даже это редко, кто знает, когда вы сделаете часть этой библиотеки своей собственной?Сюда же относятся и связанные свободные функции.
В противном случае поиск, зависящий от аргумента, не может их найти.

0 голосов
/ 19 апреля 2019

Я думаю, вы можете просто определить перегрузку подкачки в том же пространстве имен, что и класс, даже если он находится в глобальном пространстве имен. Вы ищете что-то подобное?

#include <iostream>
#include <utility>

struct S {
    void swap(S& other)
    {
        using std::swap;
        swap(data, other.data);
    }
    int data;
};

void swap(S& lhs, S& rhs)
{
    lhs.swap(rhs);
}

int main()
{
    using std::swap;
    S a = { 10 }, b = { 20 };
    std::cout << a.data << ' ' << b.data << std::endl;
    swap(a, b);
    std::cout << a.data << ' ' << b.data << std::endl;
    return 0;
}

Обратите внимание на using std::swap в основном. Так что, если вы закомментируете перегрузку подкачки для класса, код вернется к std :: swap.

...