C++:如何为多个重载函数保留公共代码路径?

Posted

技术标签:

【中文标题】C++:如何为多个重载函数保留公共代码路径?【英文标题】:C++: How to keep common code path for multiple overloaded functions? 【发布时间】:2020-06-06 23:54:05 【问题描述】:

有谁知道我怎样才能让swap_1()swap_2() 中的代码通用?我有点困惑如何做到这一点,因为参数类型的引用是不同的。

// overload the function call
template<class T> void swap_1(T&& a, T& b)

    T tmp move(a);
    a = move(b);
    b = move(tmp); 


template<class T> void swap_1(T& a, T&& b)

    T tmp move(a);
    a = move(b);
    b = move(tmp); 


void f1()

    vector<int> v = 1, 2, 3;

    swap_1(v, vector<int>4, 5, 6);

【问题讨论】:

我不确定这些重载的目的是什么。你可以做v = vector&lt;int&gt;4, 5, 6; 调用右值/移动赋值运算符和右值/移动复制构造函数。 std::swap 【参考方案1】:

您可以创建第三个模板并从其他模板中调用它:

template<class T, class U>
void swap(T&& a, U&& b)

    typename std::remove_reference<T>::type tmp std::move(a);
    a = std::move(b);
    b = std::move(tmp); 


// overload the function call
template<class T>
void swap_1(T&& a, T& b)

    swap(std::forward<T>(a), b);


template<class T>
void swap_1(T& a, T&& b)

    swap(a, std::forward<T>(b));

请记住,T &amp;&amp;a 是通用引用,而不是 R 值引用。你甚至可以用

替换这两个函数
template<class T, class U, class = typename std::enable_if<std::is_same<typename std::remove_reference<T>::type, typename std::remove_reference<U>::type>::value>::type>
void swap_1(T&& a, U&& b)

    typename std::remove_reference<T>::type tmp std::move(a);
    a = std::move(b);
    b = std::move(tmp); 

你用 C++11 标记了这个问题。使用较新版本的 C++,您可以将其编写得更简单一些。这是一个较短的 C++14 版本:

template<class T, class U, class = std::enable_if_t<std::is_same<std::remove_reference_t<T>, std::remove_reference_t<U>>::value>>
void swap_1(T&& a, U&& b)

    std::remove_reference_t<T> tmp std::move(a);
    a = std::move(b);
    b = std::move(tmp); 

【讨论】:

我还添加了较新的 C++17 标准标签以查看较新的方法(尽管由于较旧的编译器,我对 C++11 感兴趣)。谢谢 需要来自 std::remove_reference 的类型名 我理解 forward(),但我卡在 remove_reference 上。为什么需要 remove_reference?实际上,它似乎与 remove_reference 删除的行为相同。 @notaorb 是的,你是对的。我修好了它。使用 C++17,您可以使用 std::remove_reference&lt;T&gt; 而不是 typename std::remove_reference&lt;T&gt;::type 我指的是在第一个示例中添加 typename。还没试过你的第二个。

以上是关于C++:如何为多个重载函数保留公共代码路径?的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 构造函数重载 - 私有和公共

函数重载分析

如何为类重载输出函数?

如何为从C++中的模板继承的类重载赋值运算符

c++ 垃圾成员值,同时使用公共和私有重载构造函数

C++——函数重载