【问题标题】:Function overloading by swapping order of parameters通过交换参数顺序的函数重载
【发布时间】:2014-09-15 03:09:46
【问题描述】:

关于 C++ 中的函数覆盖,以下是合法的,因为两个原型有不同数量的参数:

void func(int par1, double par2);
void func(int par1, double par2, double par3);

原样(因为至少有 1 个不同类型的参数):

void func(int par1, double par2);
void func(double par1, double par2);

出于好奇,我想知道,是否可以使用相同数量、相同类型但顺序不同的参数进行重载?例如以下是合法的:

void func(int par1, double par2);
void func(double par1, int par2);

如果有,是否有正式文件说明?

【问题讨论】:

  • 只要擦除不同..
  • 如果参数都是相同类型,则允许检测重载的函数的参数类型相同。所以我相信不,这是不可能的。我不能引用标准。

标签: c++ language-lawyer overloading


【解决方案1】:

正式文档是 ISO C++ 标准,是的,您可以这样做。

整个 ISO C++11 第 13 章都致力于重载,但前几段很好地总结了它:

当为同一范围内的单个名称指定两个或多个不同的声明时,该名称被称为重载。通过扩展,同一范围内的两个声明声明相同的名称但具有不同类型的被称为重载声明。只有函数和函数模板声明可以被重载;变量和类型声明不能重载。

当在调用中使用重载函数名称时,通过比较使用点的参数类型与重载声明中可见的参数类型来确定引用哪个重载函数声明使用点。

如果参数列表不同,则可以重载,包括顺序。在您的问题中提出的所有三种情况下都不同:

{int, double} vs {int, double, double}
{int, double} vs {double, double}
{int, double} vs {double, int}

请注意,这两个函数不可能重载:

void func(int par1, int par2);
void func(int par2, int par1);

因为实际上只有 类型 提供唯一性,而不是参数名称。这两个函数都称为func,它们都有参数列表{int, int},所以它们不是唯一的。

【讨论】:

  • 8.3.5/5 也很相关。
【解决方案2】:

允许具有相同数量的参数,相同的类型,但参数顺序不同的重载函数:

void func(int a, double b) {
}

void func(double a, int b) {
}

当我们列出导出的符号时,我们得到了

000000000000025d T _Z4funcdi
000000000000024f T _Z4funcid

这意味着编译器在不同的地址上导出 2 个不同的函数。第一个是_Z4funcdi,d表示double,i表示int。

【讨论】:

    【解决方案3】:

    您可以使用相同数量、相同类型、但顺序不同的参数进行重载吗?

    如果您考虑一下 - 没有真正的理由不合法。编译器不关心函数参数代表什么,它不是那么聪明。从这个角度来看 - 两个定义是不同的,因为它们采用不同参数。

    在这种特殊情况下,您唯一需要注意的是调用函数。例如,如果您有一个定义了 operator double operator int 的类,如果您尝试这样做,编译器抛出错误:

    myClassWithBothCastOperators a, b;
    func(a,b); //<-- ERROR!
    

    即使在这种情况下,您仍然可以通过显式转换对象来调用该函数:

    myClassWithBothCastOperators a, b;
    func((int)a, (double)b); //All fine here!
    

    但是 - 我不认为它是一个好的设计模式,对于阅读和使用您的代码的人来说,决定一个合适的版本会更清楚。作为此处的真实示例,请查看 PHP 的 @987654321@。虽然在 C++ 中您可以查看变量是什么类型,但在 PHP 中,变量几乎可以保存任何类型,当 implode/explode 与名称不是很有意义的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      相关资源
      最近更新 更多