【发布时间】: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/…