函数过载。函数内部的操作是一样的。我必须重写所有内容吗?
Function overload. The operation inside the function is the same. Do I have to rewrite everything?
我有一堆输入 x
和 y
的函数。我允许输入类型通过引用传递(如果它已经存在)和通过临时输入传递(使用 &&)(如果不存在并且需要创建一个临时对象)。
基本上,我定义和重载函数如下
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)
内存问题。
编辑:
有时我还必须稍微修改一下输入。 x
和 y
.
可能存在三种类型 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
}
现在x
和y
可以是左值或右值std::vector<int>
,const
也可以不是。
我有一堆输入 x
和 y
的函数。我允许输入类型通过引用传递(如果它已经存在)和通过临时输入传递(使用 &&)(如果不存在并且需要创建一个临时对象)。
基本上,我定义和重载函数如下
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)
内存问题。
编辑:
有时我还必须稍微修改一下输入。 x
和 y
.
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
}
现在x
和y
可以是左值或右值std::vector<int>
,const
也可以不是。