我试图在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(); }
答案 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
的结果在原始代码的每次调用中都是相同的。