我想编写一个重载的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); }
演示