Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 02.09.2018, 11:45   #1
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
Репутация: 10
По умолчанию лямбда возвращает лямбду

Добрый день.
решаю задание на степике, вот его текст:
Рассмотрим следующую функцию find_if:
Код:

template<class F>
int * find_if(int * p, int * q, F f)
{
    for ( ; p != q; ++p )
        if (f(*p))
            return p;
    return q;
}

Определите переменную gen_finder, хранящую безымянную функцию, которая принимает массив значений типа int через два указателя и возвращает безымянную функцию, которая в свою очередь принимает значение типа int и проверяет, есть ли это значение в переданном массиве.
Пример:
Код:

int primes[5] = {2,3,5,7,11};

int m[10] = {0,0,1,1,4,6,7,8,9,10};

// first_prime будет указывать на число 7
int * first_prime = find_if(m, m + 10, gen_finder(primes, primes + 5));

----------------------------------------------------------------
не могу понять, как безымянная функция возвратит безымянную функцию, как это должно выглядеть. вот моё решение, но оно не правильное:
Код:

// определение переменной
#include <functional>

auto gen_finder = [](int * a, int * b) {
  std::function<bool(int)> output = [&a,&b](int i){//не уверена на счёт  захвата а и b
    for(;a<=b;a++){
        if(*a == i)
            return true;
        else return false;
        }
  };
    return output;  
};
//так, ну сейчас уже вижу, что возвращается не лямбда, а std::function
//всё же без помощи мне не обойтись
ужас,теперь вижу и то, что return output не знает что такое output
нет идей как это правильно закрутить, а очень интересно. подскажите пожалуйста

luminoforest вне форума   Ответить с цитированием
Старый 02.09.2018, 12:00   #2
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,997
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Так а проблема в чем?
Возвращаемый тип в лямбде вроде можно через -> перед { указать если он нужен.

Ну и во внутренней какая-то фигня с else.
Alex11223 вне форума   Ответить с цитированием
Старый 02.09.2018, 19:17   #3
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
Репутация: 10
По умолчанию

то есть перед { первой лямбды прямо взять и написать ->[](){} с содержимым?
проблема во всей программе и в том, что я видимо не до конца понимаю, что тут делать можно,а что нельзя, или всё задание недопоняла
luminoforest вне форума   Ответить с цитированием
Старый 02.09.2018, 20:05   #4
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,997
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Нет, можно явно указать возвращаемый тип если компилятор не может тут сам определить. Я не помню в какой ситуации это надо делать
Код:

[]() -> bool { 
    ...
}

Alex11223 вне форума   Ответить с цитированием
Старый 02.09.2018, 20:41   #5
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
Репутация: 10
По умолчанию

но ведь в задании написано, что тип, возвращаемый первой лямбдой есть ещё одна лямбда, а не bool. вот, переписала более адекватно, но всё равно выскакивает огромный список ошибок
Код:

#include <functional>

auto gen_finder = [](int * a, int * b){
  auto R = [&](int i)->bool{\\откуда вообще передаётся это значение "int i"?в примере использования такого нет
    for(;a!=b;++a){
            if(*a == i){
                return true;
            }
    return false;
    };
  return R;  
};

luminoforest вне форума   Ответить с цитированием
Старый 02.09.2018, 21:24   #6
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,997
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

bool для примера просто, я не говорил bool тут нужен или не bool (но в возвращаемой лямбде вроде как раз он и есть). Я просто сказал, что в каких-то случаях (в каких именно можете нагуглить сами) надо явно указать тип.

Цитата:
Сообщение от luminoforest Посмотреть сообщение
всё равно выскакивает огромный список ошибок
Попробуйте прочитать их.

Цитата:
Сообщение от luminoforest Посмотреть сообщение
в примере использования такого нет
Оно внутри find_if.
Более простой пример:
Код:

auto f = gen_finder(primes, primes + 5);
bool hasOne = f(1);
bool hasTwo = f(2);

Alex11223 вне форума   Ответить с цитированием
Старый 02.09.2018, 22:21   #7
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
Репутация: 10
По умолчанию

там всё ругается на __attribute__ , вроде того: expected ‘=’ before ‘__attribute__’ ; или " expected unqualified-id before string constant"
а я и не знала,что можно вызывать переменную как функцию(как в вашем простом примере).попробую ещё раз переделать всё. спасибо
luminoforest вне форума   Ответить с цитированием
Старый 02.09.2018, 22:31   #8
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,997
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от luminoforest Посмотреть сообщение
можно вызывать переменную как функцию
Даже без лямбд есть operator(), или обычные указатели на функцию из С.
Цитата:
Сообщение от luminoforest Посмотреть сообщение
expected unqualified-id before string constant
Это ошибка синтаксиса типа пропущенного ; или }
Alex11223 вне форума   Ответить с цитированием
Старый 03.09.2018, 00:22   #9
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
Репутация: 10
По умолчанию

если долго мучиться, то наконец получится))
Код:

auto gen_finder = [](int *a,int *b){

       return [&a, &b](int i)->bool{
       bool R = false;
        
        for( int* mMm = a; mMm!=b; ++mMm){
            if(*mMm == i){
                R = true;
            }
       }
        return R;
  };
};

спасибо ещё раз. заработало!
luminoforest вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лямбда-ошибка ser70 Общие вопросы по Java, Java SE, Kotlin 5 15.10.2015 20:54
Лямбда-выражения с STL shilovec5377 Visual C++ 3 11.06.2015 23:42
Одноканальная СМО. Как найти лямбду? n_drake Общие вопросы Delphi 0 21.01.2014 17:19
g++ лямбда the_deer_one Общие вопросы C/C++ 3 22.08.2010 15:19
Лямбда в С++? Utkin Общие вопросы по программированию, компьютерным наукам 8 04.06.2010 12:51


07:24.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru