C ++缩短后续函数调用

时间:2018-05-17 23:02:27

标签: c++ macros inline c++17

我试图在C ++ 17中找到一种缩短以下函数调用的方法:

GetCurrentContext()->GetEntityManager()->CreateEntity();

可能是这样的:

EM()->CreateEntity();

我尝试了一个函数指针,但这只对静态函数有效:

constexpr auto &EM = GetContext()->GetEntityManager;
// error: reference to non-static member function must be called;

有比使用宏更好的解决方案吗?

#define EM GetContext()->GetEntityManager

当使用内联函数调用时,我担心,编译器会忽略这个并且我有一个不必要的开销:

inline EntityManager* EM() { return GetCurrentContext->GetEntityManager(); }

此外,这似乎是错误的方法,因为我正在寻找别名,而不是另一个函数来定义。

修改

每个Context都有一个EntityManager,当前的Context可以在运行时更改。所以我真的在寻找别名,而不是指向函数返回的const指针。

更新

我发现了this问题。使用返回类型auto,内联函数与原始返回类型不同。即使将来更改原始功能,也不需要再次触摸别名。并且相信编译器优化,这将真正成为一个真正的别名。

所以我认为(考虑到答案和评论),最好的解决方案是执行以下操作:

inline decltype(auto) EM() { return GetCurrentContext()->GetEntityManager(); }

2 个答案:

答案 0 :(得分:0)

  1 #include <iostream>
  2 #include <string>
  3
  4 using namespace std;
  5
  6 class A {
  7   public:
  8    std::string x;
  9    A () {
 10      x += "a";
 11    }
 12
 13    std::string ax() {  //imagine this to be some object.
 14     return x;
 15    }
 16 };
 17
 18 int main () {
 19   A a;
 20   auto y = [] (decltype(a)& a) {
 21     return [&a] () {
 22       return a.ax(); //imagine this to be a big chain like yours. I just wanted to give you a working example, so I'm not doing your calls.
 23     };
 24   };
 25   std::cout << y(a)().at(0) << std::endl; //TADA!! this works
 26   return 1;
 27 }

这可以简化,我会留给你。我只是说明了如何别名,(甚至不知道类型)。

您可以使用函数指针执行类似的操作,然后根据需要为多个步骤添加别名,并在您想要的任何阶段返回。

这个想法是在另一个lambda 中有一个 lambda,这样你就不必担心对象会发生变化,因为它会转发而不存储对象。这样,每次调用lamba时都会调用链中的所有函数,因为它返回你调用的内部lambda。

如果你仔细考虑,你可以存储这个功能,你不需要做 y(a),它是匆匆写的。

答案 1 :(得分:-1)

auto const p = GetCurrentContext()->GetEntityManager();
p->CreateEntity();

在对代码的合理假设下。

在您的问题中,还有一个假设,GetEntityManager的结果在原始代码的每次调用中都是相同的。