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<int>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 &&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<T>
而不是 typename std::remove_reference<T>::type
我指的是在第一个示例中添加 typename。还没试过你的第二个。以上是关于C++:如何为多个重载函数保留公共代码路径?的主要内容,如果未能解决你的问题,请参考以下文章