Как присвоить лямбду высшей функции?

156
25 марта 2019, 10:40

Вот такой код:

            //сверху main() с аргументами
            double bl=stod(string(argv[1]));
            double br=stod(string(argv[2]));
            double h=stod(string(argv[3]));
            //тут typedef, ничего особенного;
            //y,z функции типа double -> double;
            typedef function<void* (function<double(double)>)> worker;
            worker i1 = [bl,br,h]{
                for(double i=bl;i<=br;i+=h){
                    cout <<"On the "<<i<<"the y= "<<y(i)<<"\n";
                    std::this_thread::yield();
                }
                return;
            };
            worker i2 = [bl,br,h]{
                for(double i=bl;i<=br;i+=h){
                    cout <<"On the "<<i<<"the z= "<<z(i)<<"\n";
                    std::this_thread::yield();
                }
                return;
            };

В коде действительно есть расчет на синтакс. сахар. Но что же такое мне написал компилятор?

$ g++ main2.cpp
main2.cpp: In function 'int main(int, char**)':
main2.cpp:41:4: error: conversion from 'main(int, char**)::<lambda()>' to non-scalar type 'worker' {aka 'std::function<void*(std::function<double(double)>)>'} requested
    };
    ^
main2.cpp:48:4: error: conversion from 'main(int, char**)::<lambda()>' to non-scalar type 'worker' {aka 'std::function<void*(std::function<double(double)>)>'} requested
    };
    ^
main2.cpp:50:3: error: jump to case label [-fpermissive]
   default:

И как компилятор трактует приведение лямбд к функциональному типу?

Answer 1

Откровенно говоря, не вижу, чтоб ваша лямбда принимала функцию от double, возвращающую double, и возвращала void*. Она у вас принимает void, и возвращает void - тоак что если написать

typedef function<void(void)> worker;

то все вроде как сработает...

Вы же не удивитесь, скажем, определив некий тип как указатель на функцию от трех переменных, что ему не удастся передать указатель на функцию от одной переменной?...

Answer 2

Вы забыли объявить собственно аргументы лямбды. По умолчанию, получилась лямбда без аргументов, что не соответствует определению woker-а. Исправление:

        worker i1 = [bl,br,h](function<double(double)> y){
            for(double i=bl;i<=br;i+=h){
                cout <<"On the "<<i<<"the y= "<<y(i)<<"\n";
                std::this_thread::yield();
            }
            return;
        };
READ ALSO
Компиляция QT 5.11 на Raspberry Pi 3

Компиляция QT 5.11 на Raspberry Pi 3

Raspberry Pi идет в комплекте с QT 53 и QT Creator 3

204
Проблема с консольным приложением Qt

Проблема с консольным приложением Qt

Не выплняются команды C++ QtВыводится только первый cout и все, хотя должна выводится ещё и переменная

199
Ошибка ASSERT failure in QVector&lt;T&gt;::operator[]: &ldquo;index out of range&rdquo; при записи большого объема данных в excel

Ошибка ASSERT failure in QVector<T>::operator[]: “index out of range” при записи большого объема данных в excel

С помощью библиотеки QtXlsx взятой отсюда https://githubcom/VSRonin/QtXlsxWriter пытаюсь записать файл отчёта в формате *

126
Множественное наследование с++

Множественное наследование с++

Прошу вашей помощи в объяснении множественного наследованияВозникают проблемы с наследованием методов

164