【发布时间】:2018-10-28 07:44:20
【问题描述】:
我尝试在 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,内联函数变得独立于原始返回类型。即使将来更改原始功能,也无需再次触摸别名。并且相信编译器优化,这将真正成为一个真正的别名。
所以我认为(考虑到答案和 cmets)最好的解决方案是执行以下操作:
inline decltype(auto) EM() { return GetCurrentContext()->GetEntityManager(); }
【问题讨论】:
-
当使用内联函数调用时,我担心编译器会忽略这一点,我会有不必要的开销: 编译器非常擅长这种类型的优化。您可以随时检查程序集以确认它正在完成。
-
您可能需要
decltype(auto)而不是auto。如果GetEntityManager()曾经更改为返回引用(可能是对智能指针的引用??),decltype(auto)将保留引用类型,但auto不会。 -
always inline 可以用来代替 inline 来强制它用于 gcc。