【问题标题】:How can I make an alias to a singleton function?如何为单例函数创建别名?
【发布时间】:2010-09-05 11:26:08
【问题描述】:

我想在 C++ 中为单例调用创建一个别名 所以不是每次都调用MYCLASS::GetInstance()->someFunction();,我可以在我的代码中只调用someFunctionAlias();

【问题讨论】:

  • 不使用单例总是可以为自己省去很多无意义的事情。
  • 我更新了你的问题,所以它谈论的是别名而不是 typedefs; typedef 关键字专门用于类型。

标签: c++ singleton alias


【解决方案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()

    【讨论】:

    猜你喜欢
    • 2020-04-11
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多