там есть способ сохранить лямбда с захваченными параметрами в указателе - PullRequest
1 голос
/ 14 июля 2020

У меня проблема с лямбдами, и я хочу сохранить их в указателях, но создавать их без постоянных переменных.

// Example program
#include <iostream>
#include <string>

template<short n>
void speak(){
    std::cout << "speak:[" << n << "]" << std::endl;
}

int main()
{
    typedef void(*func)(void);

    func ptr[8];
    const short j = 10;
    
    for(short i = 0; i < 4; i++){
       ptr[i] = [=](void)->void{
            std::cout << "lamda:[" << j << "]" << std::endl;
            };
        /*ptr[i] = [=](void)->void{
            std::cout << "lamda:[" << i << "]" << std::endl;
            };*/
        ptr[i + 4] = speak<j>;
        //ptr[i + 4] = speak<i>;
    }
    
    for(short i = 0; i < 8; i++){
        ptr[i]();
    }
    
    return 0;
}

Можно определить лямбда с константой var "j", но не с «i». Есть ли способ сделать это с помощью i, поэтому в этом нет необходимости:

ptr[0] = [=](void)->void{
            std::cout << "lamda:[" << 0 << "]" << std::endl;
            };
ptr[1] = [=](void)->void{
            std::cout << "lamda:[" << 1 << "]" << std::endl;
            };
ptr[2] = [=](void)->void{
            std::cout << "lamda:[" << 2 << "]" << std::endl;
            };
ptr[3] = [=](void)->void{
            std::cout << "lamda:[" << 3 << "]" << std::endl;
            };

шаблонная функция была моей другой попыткой добиться этого, но безуспешно

при попытке использовать «i» получил: «ошибка: невозможно преобразовать 'main () :: 'to' fun c {aka void () ()} 'в назначении "*

1 Ответ

3 голосов
/ 14 июля 2020

Вы используете std::function вместо указателя. Просто включите заголовок <functional> и измените

typedef void(*func)(void);

на

typedef std::function<void(void)> func;

, и все должно работать!

Не уверен, почему вам нравится писать (void) когда () тоже работает.

Причина, по которой вы не можете использовать указатель на функцию, заключается в том, что указатель функции просто указывает на код; у него нет захваченных переменных. std::function - это класс, который также может хранить захваченные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...