在下面的程序中,我有一个函数重载。一个只有一个参数,另一个有两个参数,另一个有三个。在下面的示例中,它看起来很简单,因为函数不会太长。如果函数很长并且使用不同的输入参数一次又一次地编写相同的函数看起来很难看。一种方法是variadic functions
。如果我知道我的函数只需要1,2或3个输入参数variadic functions
真的有必要吗?如果是这样我怎么能这样做?注意:具有三个输入参数和两个输入参数的函数执行不同的计算。
#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;
}
编辑:
对不起歧视的人说。我编辑了代码。
答案 0 :(得分:11)
首先,如果你的函数冗长而丑陋,你应该将它重构为一组较小的函数甚至是类。
关于你的实际问题,我会使用重载函数作为这样的包装器:
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);
}
这避免了代码重复和任何对可变参数函数的需求。使用可变参数函数会丢失静态类型检查,因此它们非常容易出错。
答案 1 :(得分:2)
任何具有可变函数的解决方案都会更糟糕:首先,可变函数不知道有多少参数,也不知道它被调用的类型,你需要额外的参数才能知道。
答案 2 :(得分:1)
我认为解决方案是只有一个带签名函数的函数(int,int,int)。
如果要复制其他变体的行为,可以使用函数(a,b,a)而不是函数(a,b)显式地执行此操作。
答案 3 :(得分:1)
在你的问题中,你要说两次写相同的长函数是令人厌倦的并且三输入和双输入版本不同。情况如何?
如果他们做同样的事情,只需从另一个中拨打一个。通常情况下,具有较小参数的函数使用一个或多个参数调用它们的直接上级,在链上,或者所有重载调用单个最大参数版本。
如果他们做了不同的事情,你可能没有理由首先超载它们。将它们称为不同的名称可能会使事情变得清晰,并且可以减轻“两次写同一功能”的感觉。
如果他们正在做类似的事情,即落在上述两种情况之间的某个地方,你可能需要额外的功能来分解原始重载函数的相同部分。
您的示例属于第一类:
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
}
答案 4 :(得分:0)
如果计算不同是不同的功能,则没有任何理由可以避免超载。
Evaen如果calc相同,你应该避免使用可能提供很多错误的Variadic_function(类型,参数计数等)
此外,尝试将3个func作为1个变量,并说它不那么难看。我会笑的
同样切换参数count是运行时(如在varidiac_function中)比编译时更差
答案 5 :(得分:0)
看起来您应该使用数组:
void Function(int* items, int count)
{
int result = 1;
for(int i = 0; i < count; i++)
{
result *= items[i];
}
}