Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Добрый день.
решаю задание на степике, вот его текст:
Рассмотрим следующую функцию 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, 11:00   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Ну и во внутренней какая-то фигня с else.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.09.2018, 18:17   #3
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
По умолчанию

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

Нет, можно явно указать возвращаемый тип если компилятор не может тут сам определить. Я не помню в какой ситуации это надо делать
Код:
[]() -> bool { 
    ...
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.09.2018, 19:41   #5
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
По умолчанию

но ведь в задании написано, что тип, возвращаемый первой лямбдой есть ещё одна лямбда, а не 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, 20:24   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

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

Цитата:
Сообщение от luminoforest Посмотреть сообщение
в примере использования такого нет
Оно внутри find_if.
Более простой пример:
Код:
auto f = gen_finder(primes, primes + 5);
bool hasOne = f(1);
bool hasTwo = f(2);
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.09.2018, 21:21   #7
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
По умолчанию

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

Цитата:
Сообщение от luminoforest Посмотреть сообщение
можно вызывать переменную как функцию
Даже без лямбд есть operator(), или обычные указатели на функцию из С.
Цитата:
Сообщение от luminoforest Посмотреть сообщение
expected unqualified-id before string constant
Это ошибка синтаксиса типа пропущенного ; или }
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.09.2018, 23:22   #9
luminoforest
 
Регистрация: 17.04.2018
Сообщений: 9
По умолчанию

если долго мучиться, то наконец получится))
Код:
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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лямбда-ошибка ser70 Общие вопросы по Java, Java SE, Kotlin 5 15.10.2015 19:54
Лямбда-выражения с STL shilovec5377 Visual C++ 3 11.06.2015 22: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