我正在尝试设计一个需要看起来像这样的 C++ 宏:
#define MY_MACRO(OBJECT, METHOD) \
[](BaseClass* obj) \
{ \
return static_cast<decltype(OBJECT)>(obj)->METHOD();\
}
基本上,一个宏转换为 lambda,在给定对象上调用给定方法。但是 lambda 需要将对象的基类作为参数(我的用例保证转换将始终有效)。此外,要调用的方法可能不在基类上。
这个宏的用法是我有另一个我不能修改的方法声明为:
void Foo(std::function<int(BaseClass*)>);
我需要能够像这样使用我的宏作为参数来调用它:
T x;
Foo(MY_MACRO(x, method)); // match std::function<int(T*)>
但是,宏代码不起作用,因为我没有捕获 OBJECT,所以当我需要将它传递给 decltype 时,它不在范围内。不过从概念上讲,编译器需要的所有信息都在那里……我该怎么做?可能吗?
一些约束:
- lambda 的参数需要是 BaseClass。我无法将其设为 decltype(OBJECT)。
- 我的情况不允许我捕获 OBJECT。
- 我无权使用通用 lambda 捕获的 C++14 功能。
最佳答案
I need access to the type of the object without capturing it.
你可以直接做。仅当您 odr-use 命名实体和未评估的操作数(如 decltype
的操作数)时才需要捕获,不要 odr-use 任何东西。这很好:
void f(){
int x;
[]{ decltype(x) y = 0; };
}
关于c++ - 如何在不捕获变量的情况下对 lambda 中的变量使用 decltype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479655/