gpt4 book ai didi

c++ - 在 lambda 中是否有记录函数名称的好方法?

转载 作者:可可西里 更新时间:2023-11-01 15:20:21 26 4
gpt4 key购买 nike

与大多数日志框架一样,我们的日志框架使用 __FUNCTION__ 预处理器宏将当前函数插入到日志文件中,因此我们的日志看起来像:

L4  T11332 609661594 [PreProcessorFunctions::RegenerateLinkIDs] [ENTER]
L4 T11332 609661594 [PreProcessorFunctions::RegenerateLinkIDs] [EXIT]
L4 T11332 609661594 [ConfigMerger::ValidateConfigObject] [ENTER]
L3 T11332 609661594 [ConfigMerger::ValidateConfigObject] Configuration Exists: 1

随着我们开始更多地使用 C++11,我注意到 labmda 生成准确但无用的__FUNCTION__ 输出:

L4  T9604 609661594 [`anonymous-namespace'::<lambda1>::operator ()] Writing EMX config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\EMXConfiguration.xml
L4 T11332 609661594 [`anonymous-namespace'::<lambda3>::operator ()] Writing Auditing config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\Auditing.xml
L4 T11960 609661594 [`anonymous-namespace'::<lambda2>::operator ()] Writing UEM config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\Configuration.xml

如您所见,所有类范围都已丢失,我们现在所知道的是此日志记录语句来自匿名 lambda。有没有人有注销封闭功能的好策略?这似乎是最有用的记录...

最佳答案

我认为唯一的解决方法是扩展 __FUNCTION__ (或 C++11 中的 __func__)在封闭函数中并在 lambda 中捕获它。

void f(){
auto& _func_ = __func__;
[&]{ std::cout << _func_; };
}

不过,我会将其标记为“实现质量”问题。例如,GCC 提供了 __PRETTY_FUNCTION__为 lambda 扩展得更好的宏(通常):

#include <iostream>

struct X{
void f(){
[]{ std::cout << __PRETTY_FUNCTION__ << "\n"; }();
}
};

int main(){
X().f();
}

输出:X::f()::<lambda()>

Live example.

关于c++ - 在 lambda 中是否有记录函数名称的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12728318/

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