c++ - 如何在无捕获的 lambda 中初始化一个范围内的项目,C++

标签 c++ lambda

我的代码如下。这行得通,它允许我在我的 lambda 中只有一个范围。

所以我想我的问题是,如何在不使用

的情况下获得相同的结果
"if(LOOP > 2 && LOOP < 5){int THERANGEVALUE = 2; FUNC[THERANGEVALUE]();}"?

而是将我的无捕获 lambda 中的项目初始化为已排列。又名,item_2 是 item_range(2,4)。然后还能够正常继续我的 lambda,而 Item_3 将等同于 item_5。

提前感谢您的帮助,如果需要,我很乐意添加更多信息。

#include <iostream>
using namespace std;
void (*FUNC[3])(void) = { //captureless lambda.
    /*ITEM_0*/[](){ cout << "x" << endl;},
    /*ITEM_1*/[](){cout << "y" << endl;},
    /*ITEM_2->ITEM_4*/[](){cout<<"z";}
};

/*Here the [](){code;} lambda is acting as a stand-in for void FUNC() so it  shouldn't touch anything outside of its scope*/
int LOOP = 4;
int main()
{
    if(LOOP > 2 && LOOP < 5){int THERANGEVALUE = 2; FUNC[THERANGEVALUE]();}
    FUNC[LOOP]();
    return 0;
}

除此之外,以下是我在询问 friend 后得出的解决方案。令我惊讶的是,它实际上比我预期的要简单得多。虽然我无法轻松地将 lambda 中的每个项目初始化为一个范围,但我可以将其传递到一个数组中并在数组内部设置一个范围。因此,虽然它不是我想要的,但它......对我的目的来说已经足够好了。如果你看到这个,谢谢 Jaime。否则我会在下面使用 PilouPili 的回答。

#include <iostream>
using namespace std;

void (*FUNC[4])(void) = { //captureless lambda.
    /*ITEM_0*/        [](){ cout << "x" << endl;},
    /*ITEM_1*/        [](){cout << "y" << endl;},
    /*ITEM_2->ITEM_4*/[](){cout<<"z";},
    /*ITEM_5*/        [](){cout<<"z";}
};

int LOOP = 4;
int main()
{
    int ARR[5]={};

    for(int I = 0; I < 6;I=I+1){//handling of ranged values.
        if(I>2 && I<5){ARR[I]=2;} else {ARR[I]=I;}
    }    
    FUNC[ARR[LOOP]]();
    return 0;
}

最佳答案

我只看路:
要么扩展你的函数数组 -> 在下一个例子中就是 FUNC1
更改 operator [] 中给定的值 -> 下一个示例中的 FUNC2

#include <iostream>
#include <vector>
using namespace std;

std::vector<void (*)(void)> init_FUNC()
{
      std::vector<void (*)(void)> func(5, [](){cout<<"z";});
      func[0]=[](){ cout << "x" << endl;};
      func[1]=[](){ cout << "y" << endl;};
      return func;
}

std::vector<void (*)(void)> FUNC1= init_FUNC();

class FUNC_MAP
{
      void (*_FUNC[3])(void) = { //captureless lambda.
    /*ITEM_0*/[](){ cout << "x" << endl;},
    /*ITEM_1*/[](){cout << "y" << endl;},
    /*ITEM_2->ITEM_4*/[](){cout<<"z";}
    };
    typedef void (*FUNC_MAP_OUT)(void);

    public:
    FUNC_MAP_OUT operator[](int i)
    {
      if(i>2 && i<5)
      {return _FUNC[2];}
      else
      {return _FUNC[i];}
    }
};


FUNC_MAP FUNC2;

/*Here the [](){code;} lambda is acting as a stand-in for void FUNC() so it  shouldn't touch anything outside of its scope*/
int LOOP = 1;
int main()
{
    FUNC1[LOOP]();
    FUNC2[LOOP]();
    return 0;
}

关于c++ - 如何在无捕获的 lambda 中初始化一个范围内的项目,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55175531/

相关文章:

java - 使用带有 lambda 的 Java 8 流来处理 for 循环,调用具有多个参数的方法

c# - 如何处理匿名类型 <T> 的强制转换委托(delegate),委托(delegate) T 以便在 IEnumerable<T> 的Where<T>() 方法中使用

c++ - 从 vector[] 获得的不可变项

C++ 错误, undefined reference 类

C++ PE 注入(inject) - 来自远程位置的 EXE 文件(例如 HTTP)

c++ - 是什么导致 C++ std::string 变量在传递给类时给出冲突的定义

c++ - 模板化运行时检查调用包装器以检测输入参数或返回值中的转换溢出

c++ - 如何创建过滤 vector 的迭代器?

java - 当运行时类型也是泛型类型时,将方法引用用作期望与泛型类型接口(interface)的方法的 lambda 时出现编译器错误

python - any = lambda v : v mean? 是什么意思