【问题标题】:c++ class function aliasesc++ 类函数别名
【发布时间】:2012-10-30 09:18:32
【问题描述】:

我想知道是否有一种简单的方法可以编写 c++ 类函数的别名。例如,如果我有一些 list 容器对象,逻辑函数将是

    int list::length() { return len; }

但程序员可能使用的另一个逻辑别名可能是

    int list::size() { return len; }

那么,有没有办法让list::size() 成为list::length() 的别名,而不是用它们的完整主体编写这两个函数,这样编译时它就不会重复,而是引用同一个函数?

我了解到您可以使用 #define 执行此操作,但我不想在完全超出范围的地方(即“大小”变量)引起与其他代号的任何混淆。
我还读过函数指针可以修复它,但这并不完全是别名(因为它必须应用取消引用),也不能给函数指针声明,给用户提供令人困惑的帮助热线(我想),如果我需要将我的代码嵌套在另一个对象中(我必须调整范围),再加上混乱。

我的一个猜测是,大多数优化编译器会将以下内容作为直接函数别名:

    inline int list::length() { return len; }
    inline int list::size() { return length(); }

或者,C++ 是否有任何严格的“别名”语法? (我找不到任何 - 不确定)
那么,最有效的方法是什么?

编辑:我接受这个答案只是为了结束这个问题,因为这只是我的好奇心。 任何有好的信息的人,请添加cmets或答案,我什至可以更改我的答案。

【问题讨论】:

  • C++ 中的别名通常是通过引用来完成的,它像指针一样工作,并增加了取消引用的需要。
  • 如果我是正确的,任何现代编译器都应该为这两个函数生成相同的程序集。
  • 好问题。我认为C++11 通过允许默认和已删除功能向它迈出了一步。如果int foo() = delete 没问题,为什么int foo() = int foo_default() 不能完全因为您提出的原因而没问题?也许在下一个标准中:) 据我所知,目前没有比在正文中显式引用其他函数更好的方法了。
  • @chris,我可以理解编译器会以相同的方式编译代码,但我希望避免在最终的 exe 中出现相同函数的两个副本。我想知道是否有办法让编译器准确地编译一个在源代码中有两个名称的函数的副本。 ;)
  • 在线查看此堆栈溢出。 stackoverflow.com/questions/145838/…

标签: c++ class function alias


【解决方案1】:

我不会使用预处理器和#define 来执行此操作。一般来说,预处理器应该是 C++ 中的最后手段。请参阅此C++ FAQ on inline functions,其中还包含有关使用预处理器宏的各种弊端的部分。

我将使用的方法是创建一个函数,该函数将具有多个不同的别名以及更复杂的函数和接口,您可以执行以下操作:

int list::length(string xString, int iValue) {
  int iReturnValue = 0;  // init the return value
  //  do stuff with xString and iValue and other things
  return iReturnValue;
}

然后对别名执行以下操作。

inline int list::size(string xString, int iValue) {return length(xString, iValue);}

内联基本上应该只是用实际的函数调用替换别名。

另见stack overflow posting Giving a function implementation more than one name。它提供了一些您可能不想这样做的原因。

【讨论】:

  • 所以,我想我的问题是,内联函数仍然堆栈参数;这会应用双堆栈吗?即堆栈list::size 函数的参数,然后堆栈另一个 内部list::length 函数调用的参数集,因为编译器可能希望以其他方式重用list::size 参数只是再次发送它们?还是编译器会捕捉到这一点并只应用一个堆栈?我知道这对现代系统实际上并没有太大的优化,但我只是好奇..
  • @AUTO,这是关于内联函数的常见问题解答 (parashift.com/c++-faq/inline-functions.html)。内联函数的想法是编译器不会生成对函数的调用,而是获取函数的源文本并内联编译它,用生成的函数目标代码替换函数调用。这就是为什么它会导致代码膨胀。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多