Как инициализировать элементы в диапазоне в лямбда без захвата, C ++ - PullRequest
1 голос
/ 15 марта 2019

Мой код ниже.Это работает, это позволяет мне иметь ровно один диапазон в моей лямбде.

Так что я думаю, что мой вопрос заключается в том, как добиться тех же результатов, не используя

"if(LOOP > 2 && LOOP < 5){int THERANGEVALUE = 2; FUNC[THERANGEVALUE]();}"?

И вместоинициализируйте предмет в моей безвоздушной лямбде как находящийся на расстоянии.иначе, item_2 является item_range (2,4).И затем также возможность продолжить мою лямбду в обычном режиме, тогда как 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;
}

В дополнение к этому ниже приводится решение, которое я пришел после того, как спросил друга.К моему удивлению, все оказалось намного проще, чем я ожидалХотя я не мог легко инициализировать каждый элемент в лямбда-диапазоне, я мог передать его в массив и установить диапазон внутри массива.Так что, хотя это не совсем то, что я искал, это ... достаточно хорошо для моих целей.Спасибо, Хайме, если увидишь это.В противном случае я бы воспользовался ответом 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 голосов
/ 15 марта 2019

Я только вижу способ:
либо расширить свой массив функций -> Это 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...