如何在lambda中的变量上使用decltype而不捕获它? 我试图设计一个C++宏,需要看起来像这样: #define MY_MACRO(OBJECT, METHOD) \ [](BaseClass* obj) \ { \ return static_cast<decltype(OBJECT)>(obj)->METHOD();\ } #定义MY_宏(对象、方法)\ [](基类*obj)\ { \ 返回static_cast(obj)->METHOD()\ }
基本上,是一个宏,它转换为lambda,在给定对象上调用给定方法。但是lambda需要将对象的基类作为参数(我的用例保证强制转换始终有效)。此外,要调用的方法可能不在基类上 此宏的用法是,我有另一个无法修改的方法,声明为:如何在lambda中的变量上使用decltype而不捕获它? 我试图设计一个C++宏,需要看起来像这样: #define MY_MACRO(OBJECT, METHOD) \ [](BaseClass* obj) \ { \ return static_cast<decltype(OBJECT)>(obj)->METHOD();\ } #定义MY_宏(对象、方法)\ [](基类*obj)\ { \ 返回static_cast(obj)->METHOD()\ },c++,lambda,decltype,C++,Lambda,Decltype,基本上,是一个宏,它转换为lambda,在给定对象上调用给定方法。但是lambda需要将对象的基类作为参数(我的用例保证强制转换始终有效)。此外,要调用的方法可能不在基类上 此宏的用法是,我有另一个无法修改的方法,声明为: void Foo(std::function<int(BaseClass*)>); voidfoo(std::function); 我需要能够使用我的宏作为参数调用它,如下所示: T x; Foo(MY_MACRO(x, method)); // match
void Foo(std::function<int(BaseClass*)>);
voidfoo(std::function);
我需要能够使用我的宏作为参数调用它,如下所示:
T x;
Foo(MY_MACRO(x, method)); // match std::function<int(T*)>
tx;
Foo(MY_宏(x,方法));//match std::函数
但是,宏代码不起作用,因为我没有捕获对象,所以当我需要将其传递给decltype时,它不在范围内。从概念上讲,编译器需要的所有信息都在那里。。。我该怎么做?可能吗
一些限制条件:
您可以向lambda添加一个可选参数,该参数的类型为所需的类型,并对该参数使用
decltype
。下面是模式的一个示例,减去宏:
int main() {
int foo = 4;
auto lambda = [](double* bar, decltype(foo)* TP = nullptr) {
return static_cast<std::remove_pointer<decltype(TP)>::type>(*bar);
};
double x = 5;
return lambda(&x);
}
intmain(){
int-foo=4;
自动lambda=[](双*条,decltype(foo)*TP=nullptr){
返回静态_型钢(*bar);
};
双x=5;
返回lambda(&x);
}
我在这里得到一个指向decltype(foo)
的指针,因为指针类型可以很容易地默认为nullptr
,以确保参数是可选的。如果decltype(foo)
已经解析为指针类型,就像我正确处理的情况一样,您就不需要它(并且删除\u指针)
。下面是一个尝试:
template <typename T>
auto lambda_maker(int (T::* MF)())
{
return [](T* p) -> int { return (p->*MF)(); };
}
#define MY_MACRO(OBJ, METH) lambda_maker<decltype(OBJ)>(METH)
模板
自动lambda_生成器(int(T::*MF)()
{
return[](T*p)->int{return(p->*MF)(;};
}
#定义MY_宏(对象、方法)lambda_生成器(方法)
我需要在不捕获对象的情况下访问对象的类型
你可以直接做。仅当odr使用命名实体时才需要捕获,并且未计算的操作数(如decltype
的操作数)不需要odr使用任何东西。这很好:
void f(){
int x;
[]{ decltype(x) y = 0; };
}
你考虑过std::mem_fn吗?是的,我试过,但我不能在我的情况下使用它。我在概括我的问题陈述;事实上,事情并不是这么简单。但底线是它必须是一个lambda,我需要在不捕获它的情况下访问对象的类型。你能添加一个用法示例吗?只是为了说明?添加到问题中。所讨论的用法示例将是实际传递到宏的内容。很遗憾,我不能这样做,因为我需要宏计算出与std::function匹配的值。不要担心int,我的用例保证类型总是匹配的。@PaulAccisano,您可以通过在另一个具有正确签名的lambda中捕获该lambda来逃脱。@PaulAccisano,不,等等,您甚至不需要它。lambda可以直接在类型为:哇!我不知道std::函数有那么灵活!令人惊叹的!我想这是一条路,就像做梦一样!谢谢有趣的是,这无法在VisualStudio中编译。编译器错误?@PaulAccisano MSVC,嗯/叹息