【发布时间】:2016-09-13 22:01:47
【问题描述】:
我正在尝试设计一个需要如下所示的 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 功能。
【问题讨论】:
-
你考虑过
std::mem_fn吗? -
是的,我已经尝试过了,但我无法在我的情况下使用它。我正在概括我的问题陈述;事实上,事情并没有这么简单。但最重要的是它必须是一个 lambda,我需要访问对象的类型而不捕获它。
-
你能添加一个使用例子吗,只是为了说明?
-
已添加到问题中。
-
有问题的用法示例是实际传递给宏的内容。