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

Eth*_*abc 1 c++ move-semantics c++11

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:有时我还必须稍微修改输入。可能有三种类型的不同子集std::vector<int> &,std::vector<int> &&,const std::vector<int> &xy

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

结合@Ken Wayne VanderLinde 和@NathanOliver 的两个答案,我能够编写一个仅限ystd::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){}
Run Code Online (Sandbox Code Playgroud)

Ken*_*nde 7

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

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

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