gpt4 book ai didi

C++ 缩短后续函数调用

转载 作者:太空狗 更新时间:2023-10-29 23:20:21 25 4
gpt4 key购买 nike

我试图在 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(); }

最佳答案

  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),它是仓促写的。

关于C++ 缩短后续函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50401618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com