交换重载,可以采用l值和r值引用以及不同类型

时间:2018-01-25 02:44:05

标签: c++ templates

我想写一个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}}变种吗?

之外别无其他选择

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); }

Demo