Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 避免函数重载_C++_Variadic Functions_Overloading - Fatal编程技术网

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++会调用一个<代码>矢量< /代码>,并且这里的要求是非常具体的。而且,这个解决方案不适合描述。问题的解决。