如何在 lambda 捕获中显式捕获宏?

How to explicitly capture a macro inside a lambda capture?

我有一个 lambda,想打印定义 lambda 的函数的名称。如果我在 lambda 中使用 __FUNCTION__,它只会打印 operator(),这是合理的因为这是宏所在的函数。

但是,Clang-Tidy 对此发出警告并提到以下内容:

Clang-Tidy: Inside a lambda, '__FUNCTION__' expands to the name of the function call operator; consider capturing the name of the enclosing function explicitly

有什么方法可以捕获封闭函数的名称 而无需 在 lambda 之前用 const char* name = __FUNCTION__ 声明它并捕获 name。 IE。像这样:

#include <iostream>

int main()
{
    [&__FUNCTION__](){
        std::cout << __FUNCTION__ << std::endl;  // Should print "main".
    }();

    return 0;
}

上面的代码显然行不通,因为宏会在预处理阶段展开。

限制的原因是因为所有内容都在将在表达式中使用的宏中,但我仍然想 运行 一些语句。例如:

#define ALLOCATE(allocator, size) [&](){                                            \
    std::cout << "Allocating in " << __FILE__ << ":" << __FUNCTION__ << std::endl;  \        
    return allocator.allocate(size);                                                \
}()

是的,从 C++14 开始,可以使用 lambda 捕获初始化程序,它允许按名称捕获任意表达式。所以一个解决方案是:

#include <iostream>

int main()
{
    [function_name=__FUNCTION__](){
        std::cout << function_name << std::endl;  // Prints "main".
    }();

    return 0;
}