交换重载,可以采用 L 值和 R 值引用以及不同类型的引用



我想编写一个重载的swap,我希望编译器通过 ADL 找到它。此版本的 swap 可以交换两个不同类型的参数,这些类型在同一命名空间中定义。这是我认为可能有效的:

#include <utility>
namespace mynamespace
{
    struct FirstStruct
    {
    };
    struct SecondStruct
    {
    };
    template<typename first_t, typename second_t>
    void swap(first_t&&, second_t&&)
    {
        ...
    }
}

我使用通用引用,因为我希望它同时适用于 r 值引用(临时(和 l 值引用。

但是,这以及我为避免编写大量专用重载而尝试的许多其他变体似乎不起作用,尤其是在对swap进行非限定调用之前指定using std::swap时,这就是我希望大多数用户会做的事情。

我别无选择,只能编写4 x 4 = 16 swap变体吗?

你只需要 3 个重载:

template<typename first_t, typename second_t>
void swap(first_t&&, second_t&&)
{
    //...
}
 // for better match than std::swap
 void swap(FirstStruct& lhs, FirstStruct& rhs) { swap<FirstStruct&, FirstStruct&>(lhs, rhs); }
 void swap(SecondStruct& lhs, SecondStruct& rhs) { swap<SecondStruct&, SecondStruct&>(lhs, rhs); }

演示

最新更新