如何在lambda中的变量上使用decltype而不捕获它? 我试图设计一个C++宏,需要看起来像这样: #define MY_MACRO(OBJECT, METHOD) \ [](BaseClass* obj) \ { \ return static_cast<decltype(OBJECT)>(obj)->METHOD();\ } #定义MY_宏(对象、方法)\ [](基类*obj)\ { \ 返回static_cast(obj)->METHOD()\ }

如何在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

基本上,是一个宏,它转换为lambda,在给定对象上调用给定方法。但是lambda需要将对象的基类作为参数(我的用例保证强制转换始终有效)。此外,要调用的方法可能不在基类上

此宏的用法是,我有另一个无法修改的方法,声明为:

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(OBJECT)
  • 我的情况不允许我捕获对象
  • 我没有访问广义lambda捕获的C++14特性的权限

  • 您可以向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,嗯/叹息