C++ 避免函数重载
在下面的程序中,我有一个函数重载。一个只有一个参数,另一个有两个参数,另一个有三个参数。在下面的示例中,它看起来很简单,因为函数不太长。如果函数很长,用不同的输入参数反复编写同一个函数看起来很难看,该怎么办。一种方法可以是C++ 避免函数重载,c++,variadic-functions,overloading,C++,Variadic Functions,Overloading,在下面的程序中,我有一个函数重载。一个只有一个参数,另一个有两个参数,另一个有三个参数。在下面的示例中,它看起来很简单,因为函数不太长。如果函数很长,用不同的输入参数反复编写同一个函数看起来很难看,该怎么办。一种方法可以是可变函数。如果我知道我的函数只接受1,2或3个输入参数,那么变量函数是否真的有必要?如果是这样,我该怎么做?注意:具有三个输入参数和两个输入参数的函数执行不同的计算 #include <iostream> using namespace std; int func
可变函数
。如果我知道我的函数只接受1,2或3个输入参数,那么变量函数是否真的有必要?如果是这样,我该怎么做?注意:具有三个输入参数和两个输入参数的函数执行不同的计算
#include <iostream>
using namespace std;
int function(int a, int b, int c) // All the arguments are always of the same type
{
return a*b*c;
}
int function(int a, int b)
{
int c = a; // Always duplicate the first argument
return a*b*c;
}
int function(int a)
{
int b = a, c = a; // Always duplicate the first argument
return a*b*c;
}
int main()
{
cout<<function(2,3,4)<<"\n"<<function(2,3)<<"\n"<<function(2);
cin.ignore();
return 0;
}
#包括
使用名称空间std;
int-function(int-a,int-b,int-c)//所有参数的类型始终相同
{
返回a*b*c;
}
int函数(int a,int b)
{
int c=a;//始终重复第一个参数
返回a*b*c;
}
int函数(inta)
{
int b=a,c=a;//始终复制第一个参数
返回a*b*c;
}
int main()
{
cout任何使用可变函数的解决方案都会更糟:首先,可变函数不知道调用了多少个参数,也不知道调用的是哪种类型,您需要额外的参数来知道这一点。如果计算不同的是不同的函数,您没有任何理由避免重载
Evaen如果计算值相同,则应避免使用可能提供大量错误(类型、参数计数等)的Variadic_函数
此外,试着把这3个函数当作1个变量来做,并说它不那么难看。我会笑的
此外,在运行时(如varidiac_函数)切换参数计数比在编译时切换参数计数更糟糕我认为解决方案是只使用一个带有签名函数(int,int,int)的函数
如果要复制其他变体的行为,可以显式地使用函数(a、b、a)而不是函数(a、b)。看起来应该使用数组:
void Function(int* items, int count)
{
int result = 1;
for(int i = 0; i < count; i++)
{
result *= items[i];
}
}
void函数(int*项,int计数)
{
int结果=1;
for(int i=0;i
首先,如果你的函数又长又难看,你应该把它重构成一组更小的函数甚至类
至于您的实际问题,我将使用重载函数作为包装器,如下所示:
int function(int a, int b, int c)
{
return a * b * c;
}
int function(int a, int b)
{
return function(a, b, a);
}
int function(int a)
{
return function(a, a, a);
}
这避免了代码重复和对可变函数的任何需要。使用可变函数时,您会丢失静态类型检查,因此它们非常容易出错。在您的问题中,您指出多次编写相同的长函数是令人厌烦的,并且三输入和两输入版本不同。是什么情况
- 如果它们在做相同的事情,只需从另一个调用一个。通常情况下,参数较小的函数调用其直接上级时,会使用一个或多个参数,或者所有重载调用单个参数最多的版本
- 如果他们在做不同的事情,你可能没有理由一开始就让他们超负荷工作。给他们起不同的名字可能会让事情变得更清楚,并减轻“两次编写同一个函数”的感觉
- 如果它们在做类似的事情,即介于上述两种情况之间,您可能需要额外的函数来分解原始重载函数的相同部分
您的示例属于第一类:
int function(int a, int b, int c) // All the arguments are always of the same type
{
return a*b*c;
}
int function(int a, int b) // Always duplicate the first argument
{
return function(a,b,a);
}
int function(int a) // Always duplicate the first argument
{
return function(a,a);
// return function(a,a,a); //might make more sense depending on actual function/variable names
}
你说“一遍又一遍地写同一个函数看起来很难看”,但是,它们不是同一个函数。您的函数接受一个、两个或三个参数,然后根据算术性执行完全不同的操作。您打算如何将其组合到单个函数中,以及您真正希望得到什么好处?如何在一个函数中处理所有三种情况?我编辑了代码。对于歧义,抱歉这是个好主意。我从来没有想过这个问题。感谢你有缺省的参数,我们应该强烈地考虑这个路径。STL的微软实现非常严重。C++会调用一个<代码>矢量< /代码>,并且这里的要求是非常具体的。而且,这个解决方案不适合描述。问题的解决。