Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 193
1

Передача лямбда выражения в функцию

03.02.2020, 13:35. Просмотров 1914. Ответов 16
Метки нет (Все метки)


Не могу передать лямбда выражение (строка 131) в функцию (строка 94). В отладчике лямбда выражение (predicate) имеет тип <lambda(const Date&, const string&)>

Передача лямбда выражения в функцию


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
class Node {
public:
    virtual bool Evaluate(const Date& date, const string& event) const = 0;
};
 
class DateComparisonNode : public Node {
public:
    DateComparisonNode(const Comparison& c, const Date& d)
        : cmp { c }
        , date_ { d }
    {
    }
    bool Evaluate(const Date& date, const string& event) const override
    {
        switch (cmp) {
        case Comparison::Less:
            return date < date_;
        case Comparison::LessOrEqual:
            return date <= date_;
        case Comparison::Greater:
            return date > date_;
        case Comparison::GreaterOrEqual:
            return date >= date_;
        case Comparison::Equal:
            return date == date_;
        case Comparison::NotEqual:
            return date != date_;
        }
        return -1;
    }
    const Comparison cmp;
    const Date date_;
};
 
class EventComparisonNode : public Node {
public:
    EventComparisonNode(const Comparison& c, const string& event)
        : cmp { c }
        , event_ { event }
    {
    }
    bool Evaluate(const Date& date, const string& event) const override
    {
        switch (cmp) {
        case Comparison::Equal:
            return event_ == event;
        case Comparison::NotEqual:
            return event_ != event;
        }
        return 0;
    }
    const Comparison cmp;
    const string event_;
};
 
class LogicalOperationNode : public Node {
public:
    LogicalOperationNode(const LogicalOperation& l_op, const shared_ptr<Node>& l, const shared_ptr<Node>& r)
        : logical_operation { l_op }
        , left { l }
        , right { r }
    {
    }
    bool Evaluate(const Date& date, const string& event) const override
    {
        switch (logical_operation) {
        case LogicalOperation::And:
            return left->Evaluate(date, event) && right->Evaluate(date, event);
        case LogicalOperation::Or:
            return left->Evaluate(date, event) || right->Evaluate(date, event);
        }
    }
    const LogicalOperation logical_operation;
    const shared_ptr<Node> left;
    const shared_ptr<Node> right;
};
 
class EmptyNode : public Node {
    bool Evaluate(const Date& date, const string& event) const
    {
        return 0;
    }
};
 
class Database {
public:
    Database() {}
    void Add(const Date& date, const string& event);
 
    bool DeleteEvent(const Date& date, const string& event);
 
    int DeleteDate(const Date& date);
 
    vector<string> FindIf(function<bool(Date, string)> f);
 
    void Print(ostream& ost);
 
private:
    map<Date, set<string>> db;
};
 
int main()
{
    TestAll();
 
    Database db;
 
    for (string line; getline(cin, line);) {
        istringstream is(line);
 
        string command;
        is >> command;
        if (command == "Add") {
            const auto date = ParseDate(is);
            const auto event = ParseEvent(is);
            db.Add(date, event);
        } else if (command == "Print") {
            db.Print(cout);
        } else if (command == "Del") {
            auto condition = ParseCondition(is);
            auto predicate = [condition](const Date& date, const string& event) {
                return condition->Evaluate(date, event);
            };
            //                int count = db.RemoveIf(predicate);
            //                cout << "Removed " << count << " entries" << endl;
        } else if (command == "Find") {
            auto condition = ParseCondition(is);
            auto predicate = [condition](const Date& date, const string& event) {
                return condition->Evaluate(date, event);
            };
            const auto entries = db.FindIf(predicate);
            for (const auto& entry : entries) {
                cout << entry << endl;
            }
            cout << "Found " << entries.size() << " entries" << endl;
        } else if (command == "Last") {
            try {
                //                    cout << db.Last(ParseDate(is)) << endl;
            } catch (invalid_argument&) {
                cout << "No entries" << endl;
            }
        } else if (command.empty()) {
            continue;
        } else {
            throw logic_error("Unknown command: " + command);
        }
    }
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2020, 13:35
Ответы с готовыми решениями:

Передача переменной в лямбда-функцию по значению
Ребят! А объясните, что тут происходит, позязя :). function&lt;int()&gt; f() { int x = 0;...

Передача аргумента в функцию (Лямбда выражения)
Не совсем понял, передача функции в качестве аргумента. А где здесь делегат используется? Или он...

Помогите пожалуйста определить функцию, которая проверяет список на лямбда-выражения
Помогите пожалуйста определить функцию, которая проверяет список на лямбда-выражения ( это вроде не...

Лямбда-выражения. Как описать лямбда-процедуру и передать в нее файловую переменную?
Погуглив не смогла найти ответов на свои вопросы. Есть следующая процедура, которая находит...

16
Don't worry, be happy
16970 / 9851 / 1897
Регистрация: 27.09.2012
Сообщений: 24,426
Записей в блоге: 1
03.02.2020, 13:45 2
Приблизим:
C++
1
2
3
function<bool(Date, string)>
//-->
auto predicate = [condition](const Date& date, const string& event)
0
С чаем беда...
Эксперт CЭксперт С++
8496 / 4218 / 1169
Регистрация: 18.10.2014
Сообщений: 9,140
03.02.2020, 14:31 3
Цитата Сообщение от EvilingDark Посмотреть сообщение
Не могу передать
И? Что означает "не могу передать"?
1
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 193
03.02.2020, 14:56  [ТС] 4
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И? Что означает "не могу передать"?
Я не знаю как передать. Вот такие ошибки компилятор пишет:
main.cpp:53: undefined reference to `Database::FindIf(std::function<bool (Date, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)>)'

collect2.exe: error: ld returned 1 exit status
0
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
03.02.2020, 14:58 5
Цитата Сообщение от EvilingDark Посмотреть сообщение
C++
1
2
3
4
5
class DateComparisonNode : public Node {
public:
 DateComparisonNode(const Comparison& c, const Date& d)
 : cmp { c }
 , date_ { d }
EvilingDark, "не могу", это хорошее и членораздельное начало. Зачем же вы оборвали стиль? Я не нашёл определения для класса Date, хотя он является объектом сравнения и возможно его проблемы - проблема и компоратора (предиката). Ну так как нет конкретики (а есть куча лишнего) - позволю себе пованговать. Некоторые классы терпеть не могут передачу локальных функторов в качестве предикат, насколько я помню. Во всяком случае нужно не забывать квалификатор константности например. Почистите переформулируйте вопрос. Это поможет понять, что нужно ответить.
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 193
03.02.2020, 15:05  [ТС] 6
Цитата Сообщение от IGPIGP Посмотреть сообщение
"не могу", это хорошее и членораздельное начало. Зачем же вы оборвали стиль? Я не нашёл определения для класса Date, хотя он является объектом сравнения и возможно его проблемы - проблема и компоратора (предиката). Ну так как нет конкретики (а есть куча лишнего) - позволю себе пованговать. Некоторые классы терпеть не могут передачу локальных функторов в качестве предикат, насколько я помню. Во всяком случае нужно не забывать квалификатор константности например. Почистите переформулируйте вопрос. Это поможет понять, что нужно ответить.
coursera_26_dataBase.rar
Вот весь проект, думал хватит того что я скопировал. Я не знаю как еще перефразировать. Я нашел 2 варианта как передать функцию, 1 в проекте, 2 bool (*f) (const Date& date, const string& event);
0
С чаем беда...
Эксперт CЭксперт С++
8496 / 4218 / 1169
Регистрация: 18.10.2014
Сообщений: 9,140
03.02.2020, 15:11 7
Цитата Сообщение от EvilingDark Посмотреть сообщение
Я не знаю как передать. Вот такие ошибки компилятор пишет:
main.cpp:53: undefined reference to `Database::FindIf(std::function<bool (Date, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)>)'
Эти ошибки не имеют никакого отношения ни к каким лямбдам. Вам компилятор ясно говорит, что вы не определили эту функцию. При чем здесь передача лямбды вообще?

Цитата Сообщение от EvilingDark Посмотреть сообщение
coursera_26_dataBase.rar
И? Где в этом наборе файлов определение функции Database::FindIf?
0
Эксперт С++
8394 / 3934 / 859
Регистрация: 15.11.2014
Сообщений: 8,881
03.02.2020, 15:15 8
Цитата Сообщение от EvilingDark Посмотреть сообщение
undefined reference to `Database::FindIf
линкер (не компилятор) не нашел реализацию функции
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 193
03.02.2020, 15:19  [ТС] 9
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И? Где в этом наборе файлов определение функции Database::FindIf?
Я ее еще не написал.
C++
1
2
3
4
vector<string> Database::FindIf(function<bool(const Date& date, const string& event)> f);
{
    return { "123" };
}
Вот например.

Вот такие ошибки:
error: declaration of 'std::vector<std::__cxx11::basic_string<char> > Database::FindIf(std::function<bool(const Date&, const std::__cxx11::basic_string<char>&)>)' outside of class is not definition [-fpermissive]
vector<string> Database::FindIf(function<bool(const Date& date, const string& event)> f);

error: expected unqualified-id before '{' token
{
^
0
С чаем беда...
Эксперт CЭксперт С++
8496 / 4218 / 1169
Регистрация: 18.10.2014
Сообщений: 9,140
03.02.2020, 15:24 10
Цитата Сообщение от EvilingDark Посмотреть сообщение
Я ее еще не написал.
Ну так потому и ошибка. Если вы будете вызывать функции, которые вы "еще не написали", то будете получать такие ошибки. Лямбды в этом никаким боком не замешаны.

Цитата Сообщение от EvilingDark Посмотреть сообщение
Вот такие ошибки:
Если вы не знакомы с элементарным синтаксисом определения функции, то я уж не знаю, что вам сказать. Зачем вы поставили там эту ;?
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 193
03.02.2020, 15:53  [ТС] 11
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ну так потому и ошибка. Если вы будете вызывать функции, которые вы "еще не написали", то будете получать такие ошибки. Лямбды в этом никаким боком не замешаны.
Вот написал, толку только никакого, ошибки те же. Даже синтаксис иде не выделяет.
error: declaration of 'std::vector<std::__cxx11::basic_string<char> > Database::FindIf(std::function<bool(const Date&, const std::__cxx11::basic_string<char>&)>)' outside of class is not definition [-fpermissive]
vector<string> Database::FindIf(function<bool(const Date& date, const string& event)> f);

error: expected unqualified-id before '{' token
{
^



C++
1
2
3
4
5
6
7
8
9
10
11
12
vector<string> Database::FindIf(function<bool(const Date& date, const string& event)> f);
{
    vector<string> copy;
    for (auto set_ : db)
        for (auto item : set_.second)
            if (f(set_.first, item)) {
                ostringstream ost();
                ost << set_.first;
                copy.push_back(ost.str() + ' ' + item);
            }
    return copy;
}
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 193
03.02.2020, 16:26  [ТС] 12
coursera_26_dataBase.rar

main.cpp:52: undefined reference to `Database::FindIf(std::function<bool (Date, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)>)'

В чем ошибка?
0
Эксперт С++
8394 / 3934 / 859
Регистрация: 15.11.2014
Сообщений: 8,881
03.02.2020, 16:28 13
Цитата Сообщение от EvilingDark Посмотреть сообщение
vector<string> Database::FindIf(function<bool(const Date& date, const string& event)> f);
{
убери точку с запятой

должно быть так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
vector<string> Database::FindIf(const function<bool(const Date& date, const string& event)>& f)
{
    vector<string> copy;
    for (const auto& set_ : db)
        for (const auto& item : set_.second)
            if (f(set_.first, item)) {
                ostringstream ost();
                ost << set_.first;
                copy.emplace_back(ost.str() + ' ' + item);
            }
    return copy;
}
Добавлено через 1 минуту
Цитата Сообщение от EvilingDark Посмотреть сообщение
coursera_26_dataBase.rar
хочешь выложить материалы - запаковывай zip
он по дефолту уже установлен на большинстве ОС.

специально ради тебя выкачивать платный rar никто не станет.
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 193
03.02.2020, 16:28  [ТС] 14
Цитата Сообщение от hoggy Посмотреть сообщение
убери точку с запятой
уже сделал, там теперь другие проблемы
0
Комп_Оратор)
Эксперт по математике/физике
8634 / 4347 / 590
Регистрация: 04.12.2011
Сообщений: 13,010
Записей в блоге: 16
03.02.2020, 16:31 15
Цитата Сообщение от EvilingDark Посмотреть сообщение
уже сделал, там теперь другие проблемы
Заинтриговали)
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 193
03.02.2020, 16:35  [ТС] 16
Цитата Сообщение от hoggy Посмотреть сообщение
хочешь выложить материалы - запаковывай zip
он по дефолту уже установлен на большинстве ОС.
Спасибо, я всю жизнь пользовался winrar.

coursera_26_dataBase.zip
0
Эксперт С++
8394 / 3934 / 859
Регистрация: 15.11.2014
Сообщений: 8,881
03.02.2020, 17:30 17
Цитата Сообщение от EvilingDark Посмотреть сообщение
уже сделал, там теперь другие проблемы
это такое описание проблемы?

предлагаешь присутствующим самим догадаться,
какие такие "другие" проблемы там у тебя теперь?

Цитата Сообщение от EvilingDark Посмотреть сообщение
я всю жизнь пользовался winrar.
не понятно, зачем ты мне это написал.
мне как бе пофигу чем ты всю жизнь пользовался.

Цитата Сообщение от EvilingDark Посмотреть сообщение
coursera_26_dataBase.zip
подправил твой код немножко (см TODO)
ошибок компиляции у тебя там не было.
были ворнинги, и парочка UB.

coursera_26_dataBase.zip

при запуске показывает успешное прохождение тестов,
а потом срабатывает assert.
причину срабатывания я выяснять не стал.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2020, 17:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Передача лямбда в функции
В чем смысл передачи лямбда выражения функции?auto square = (int x) { return x * x; }; std::cout...

Лямбда выражения
Добрый день, помогите, пожалуйста с лямбдой. Нужно переписать вот это: public static boolean...

Лямбда выражения
В одной теме https://www.cyberforum.ru/java-j2se/thread1794469 пользователь xoraxax показал код ...

Лямбда-выражения
#include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.