如何在无捕获Lambda C ++

时间:2019-03-15 04:23:23

标签: 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;
}

此外,下面是我问一个朋友后想出的解决方案。令我惊讶的是,它实际上比我预期的要简单得多。虽然我无法轻松地在范围内初始化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;
}

1 个答案:

答案 0 :(得分:0)

我只看到路:
扩展函数数组->在下一个示例中为FUNC1
更改运算符[]中给定的值->在下一个示例中为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;
}