【发布时间】:2018-09-21 18:14:29
【问题描述】:
我从Unreal Engine的源代码中遇到了以下代码
namespace UE4Asserts_Private
{
// This is used by ensure to generate a bool per instance
// by passing a lambda which will uniquely instantiate the template.
template <typename Type>
bool TrueOnFirstCallOnly(const Type&)
{
static bool bValue = true;
bool Result = bValue;
bValue = false;
return Result;
}
FORCEINLINE bool OptionallyDebugBreakAndPromptForRemoteReturningFalse(bool bBreak, bool bIsEnsure = false)
{
if (bBreak)
{
FPlatformMisc::DebugBreakAndPromptForRemoteReturningFalse(bIsEnsure);
}
return false;
}
}
#define ensure( InExpression ) (LIKELY(!!(InExpression)) || FDebug::OptionallyLogFormattedEnsureMessageReturningFalse(UE4Asserts_Private::TrueOnFirstCallOnly([]{}), #InExpression, __FILE__, __LINE__, TEXT("") ) || UE4Asserts_Private::OptionallyDebugBreakAndPromptForRemoteReturningFalse(UE4Asserts_Private::TrueOnFirstCallOnly([]{}), true))
现在,每当我们使用 ensure(SomeExpression) 时,FDebug::OptionallyLogFormattedEnsureMessageReturningFalse 的 UE4Asserts_Private::TrueFirstCallOnly 参数仅在它第一次被特定调用堆栈调用时才计算为真(我正在考虑每个调用堆栈,因为 TrueOnFirstCallOnly 计算为在下一次调用时为 false 以确保来自同一个调用堆栈,但会从不同的调用堆栈触发确保,但不是很确定),我不明白这是如何工作的。
正如他们在 cmets 中所说,不知何故将 lambda []{} 传递给模板函数会唯一地实例化它。它是如何工作的?作为模板传递的 lambda 真正独特的是什么,是调用堆栈还是其他什么?
LIKELY(!!(InExpression)) 如果表达式为真,则可以认为其计算结果为真
【问题讨论】: