如何为单例函数创建别名?
Posted
技术标签:
【中文标题】如何为单例函数创建别名?【英文标题】:How can I make an alias to a singleton function? 【发布时间】:2010-09-05 11:26:08 【问题描述】:我想在 C++ 中为单例调用创建一个别名
所以不是每次都调用MYCLASS::GetInstance()->someFunction();
,我可以在我的代码中只调用someFunctionAlias();
。
【问题讨论】:
不使用单例总是可以为自己省去很多无意义的事情。 我更新了你的问题,所以它谈论的是别名而不是 typedefs;typedef
关键字专门用于类型。
【参考方案1】:
使用静态函数。
namespace ...
void someFunction()
MYCLASS::GetInstance()->someFunction();
;
编辑:对不起,小伙子们,我写了静态的 someFunction,意思是 void someFunction。
【讨论】:
您缺少返回类型。 将其作为内联函数可以节省可执行文件中的代码大小。 @Johannes:编译器不是忽略了inline
语句吗?
使用 inline
的唯一缺点是它降低了 API 的灵活性。如果您在更改 API 时始终能够重建代码的调用者,那没什么大不了的。但是,如果您试图维护一个稳定的 API,以便调用者不需要每次都更新(例如,因为它是库的公共接口),那么最好不要在该接口中使用 inline
。 (我很遗憾在 C,FWIW 中对 #define
做同样的事情。这确实是同一个问题,但细节不同。)
@Donal 这不仅适用于 inline
关键字,而且适用于调用者可以看到代码的 any 函数。当您使用 static
并将该函数定义放入标头时,也会发生同样的问题。使用inline
而不是static
时,唯一保证可以观察到的区别是,对于导致它被发射的每个翻译单元,函数的外线代码不会重复(通过将其地址用于示例)。【参考方案2】:
typedef 用于类型别名,但不能用作调用别名。
函数(如 DeadMG 建议的)可以用作调用“别名”。
PS。由于这是 C++,因此您有很多选项、函数指针、std::tr1::function 运算符重载和预处理器。但在这种情况下,看起来一个简单的函数肯定是最简单和最好的解决方案。
【讨论】:
【参考方案3】:查找函数指针。
您可以创建一个函数指针,并将其分配给您的长函数。然后,您可以像普通函数一样调用这个函数指针,无论您的变量是在哪里定义的。
函数指针可能会令人困惑,但在 API 回调中经常使用(即,您将函数作为参数传递给 API,API 将在发生某些事情时调用该函数(想想 WndProc)。
祝你好运。
【讨论】:
函数指针的想法可能行不通,因为看起来someFunction
是一个非静态成员函数。当我意识到这是一个陷阱时,我已经考虑过可能会推荐函数引用。【参考方案4】:
你可以这样做
#define someFunctionAlias MYCLASS::GetInstance()->someFunction()
【讨论】:
我同意在 c++ 中,一个宏被合理地拒绝了。在某些情况下,它的使用是合理的,我觉得这就是其中之一。这里不涉及任何类型,OP 只需要一个别名来提高代码的可读性。以下链接显示了 SO 社区接受它的位置***.com/questions/96196/when-are-c-macros-beneficial、***.com/questions/546997/…以上是关于如何为单例函数创建别名?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 DJANGO 中动态创建的 URL 设置 URL 别名?