c++ - 如何在不捕获变量的情况下对 lambda 中的变量使用 decltype?

标签 c++ lambda decltype

我正在尝试设计一个需要看起来像这样的 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 时,它​​不在范围内。不过从概念上讲,编译器需要的所有信息都在那里……我该怎么做?可能吗?

一些约束:

  1. lambda 的参数需要是 BaseClass。我无法将其设为 decltype(OBJECT)。
  2. 我的情况不允许我捕获 OBJECT。
  3. 我无权使用通用 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/

相关文章:

c++ - 通过通用引用捕获

lambda - Kotlin Lambda参数与抽象值

c++ - C++14 中 decltype(auto) 的转换函数

c++ - 为什么libstdc++-v3中declval的实现看起来那么复杂?

c++ - istringstream::str() 不返回当前内容

c++ - 比较 float 的相等计算输出

c++ - 可以给 `std`命名空间添加推导指南吗?

C++ - vector 迭代器不可递增错误

java - 如何避免在 java 8 中使用接口(interface)?

c++ - 具有完美转发的对的返回元素