如何为单例函数创建别名?

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/…

以上是关于如何为单例函数创建别名?的主要内容,如果未能解决你的问题,请参考以下文章

如何为包含函数类型别名的结构实现Debug?

如何为 mercurial 用户创建别名?

如何为 WebSocket(红蜘蛛)创建单例?

如何为 DJANGO 中动态创建的 URL 设置 URL 别名?

如何为 Spark SQL 中的posexplode 列提供别名?

如何为 gcp 中的组提供权限(创建/查看)并启用相同的日志记录