我想写一个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值refs(临时值)和l值refs。
然而,这个,以及我试图避免编写大量专用重载的许多其他变体似乎不起作用,特别是在进行不合格之前指定using std::swap
时致电swap
,这是我期望大多数用户所做的。
我除了编写4 x 4 = 16
的{{1}}变种吗?
答案 0 :(得分:1)
你只需要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); }