函数过载。函数内部的操作是一样的。我必须重写所有内容吗?

Function overload. The operation inside the function is the same. Do I have to rewrite everything?

我有一堆输入 xy 的函数。我允许输入类型通过引用传递(如果它已经存在)和通过临时输入传递(使用 &&)(如果不存在并且需要创建一个临时对象)。

基本上,我定义和重载函数如下

double foo(const std:::vector<int> & x, const std:::vector<int> &  y){
// Do something
}
double foo(const std:::vector<int> & x,std:::vector<int>&& y){
// Do something
}
double foo(std:::vector<int>&& x,const std:::vector<int> &  y){
// Do something
}
double foo(std:::vector<int>&& x,std:::vector<int>&& y){
// Do something
}

//Do something 完全相同,但唯一的区别是输入类型。有没有一种方法可以在没有太多冗余的情况下简化代码?我不想 foo(std:::vector<int> x,std:::vector<int> y) 内存问题。

编辑: 有时我还必须稍微修改一下输入。 xy.

可能存在三种类型 std::vector<int> &,std::vector<int> &&,const std::vector<int> & 的不同子集

正如@AVH 所指出的(谢谢!),如果它只是来自 std::vector<int> &&,const std::vector<int> &const std::vector<int> & 应该足以完成这项工作。

结合@Ken Wayne VanderLinde 和@NathanOliver 的两个答案,我能够编写一个函数,将 y 限制为仅 std::vector<int> &&,const std::vector<int> & 并将 x 限制为任何 ``std::vector &,std::vector &&,const std::vector &` 通过写

template<class T2,         
std::enable_if_t<std::is_same_v<std::decay_t<T2>,std::vector<int>>,bool> = true>        
void foo(T2 && a, const std::vector<int> & b){}

由于函数都做同样的事情,它们显然不会修改输入。在那种情况下,甚至不必理会右值引用,而只需使用 const 左值引用。即,这是您唯一需要的功能:

double foo(const std:::vector<int> & x, const std:::vector<int> & y){
// Do something
}

临时对象将绑定到 const 左值引用,因此这个函数可以处理临时对象和非临时对象。

您可以使用一个函数模板来完成此操作,而不是编写四个重载。这样做会给你一个像

这样的功能
template <typename Vec1, typename Vec2,
          std::enable_if_t<std::is_same_v<std::decay_t<Vec1>, std::vector<int>> &&
                           std::is_same_v<std::decay_t<Vec2>, std::vector<int>>, bool> = true>
double foo(Vec1&& x, Vec2&& y)
{
    // stuff
}

现在xy可以是左值或右值std::vector<int>const也可以不是。