170 похожих чатов

Привет. Как создать std::function который хранит ссылку на вариативную

функцию ?

17 ответов

19 просмотров

Можно пример псевдокодом, а то нихрена не понятно

Artur
Можно пример псевдокодом, а то нихрена не понятно

https://ru.wikipedia.org/wiki/%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F

Ok-ㅤ Автор вопроса
Artur
Можно пример псевдокодом, а то нихрена не понятно

std::function<void(…)> Это не работает, но надеюсь объяснит что я хочу сделать

Ok ㅤ
std::function<void(…)> Это не работает, но надеюс...

ты хочешь класс, который можно будет вызвать с произвольным кол-вом аргументом?

Ok-ㅤ Автор вопроса
Mikail Bagishov
ты хочешь класс, который можно будет вызвать с про...

Нет, я хочу массив функций с произвольным количеством аргументов. Зачем ? Я эти функции передам в библиотеку

Ok ㅤ
Нет, я хочу массив функций с произвольным количест...

то есть: std::vector functions = { std::function<void(int, float, double)>, std::function<void(int, bool, string)> }; ?

Ok-ㅤ Автор вопроса

Да, грубо говоря

Ok ㅤ
Да, грубо говоря

А прям точно массив требуется ? Это можно более элегантно сделать: #include <string> #include <vector> #include <functional> template < typename... Ts > struct Overloaded : Ts... { using Ts::operator()...; }; int main() { // std::vector functions = { // std::function<void()>{ [] () {} }, // std::function<void()>{ [] () {} }, // }; Overloaded overloaded = { [] (int, double, float) {}, [] (int, double, int) {}, [] (int, double, bool) {}, [] (int, double, std::string) {}, }; return 0; }

Artur
то есть: std::vector functions = { std::function...

Погоди, но ведь std::function<void(int, float, double) и std::function<void(int, bool, string) это разные типы. смотри на сигнатуры. Ты не положишь их в один и тот же контейнер. Иди запакуй их сначала в std::variant. Но потом тебе надо будет узнавать какой там лежит тип в варианте. Я кстати, не знаю, как узнать какой в нем std::function. Объект, наполненный перегрузками и скармиливать его в std::visit ? Не будет ли случайно когда совпадут какие то сигнатуры и компилятор не сможет выбрать правильную перегрузку? В одном контейнере ты не можешь хранить ни указатели на функции ни std::function с разными сигнатурами, ни тем более лямбды (даже с одинаковыми сигнатурами, так как две одинаковые внешне лямбды по факту разные классы!)

The Pressbraker
Погоди, но ведь std::function<void(int, float, dou...

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Artur
А прям точно массив требуется ? Это можно более эл...

Классно! Не подумал от таком решении. А как сделать, чтоб работало в 17 стандарте? Явно указать в угловых скобках типы для overloaded ? В 20 все скомпилировалось, а в 17 пишет такие ошибки " over_func.cpp:20:5: error: class template argument deduction failed: 20 | }; | ^ over_func.cpp:20:5: error: no matching function for call to 'Overloaded(main()::<lambda(int, double, float)>, main()::<lambda(int, double, int)>, main()::<lambda(int, double, bool)>, main()::<lambda(int, double, std::string)>)' over_func.cpp:7:8: note: candidate: 'template<class ... Ts> Overloaded()-> Overloaded<Ts>' 7 | struct Overloaded : Ts... | ^~~~~~~~~~ over_func.cpp:7:8: note: template argument deduction/substitution failed: over_func.cpp:20:5: note: candidate expects 0 arguments, 4 provided 20 | }; | ^ over_func.cpp:7:8: note: candidate: 'template<class ... Ts> Overloaded(Overloaded<Ts>)-> Overloaded<Ts>' 7 | struct Overloaded : Ts... | ^~~~~~~~~~ over_func.cpp:7:8: note: template argument deduction/substitution failed: over_func.cpp:20:5: note: 'main()::<lambda(int, double, float)>' is not derived from 'Overloaded<Ts>' 20 | }; | ^ "

The Pressbraker
Классно! Не подумал от таком решении. А как сделат...

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Ok ㅤ
std::function<void(…)> Это не работает, но надеюс...

У этой функции и сигнатура неправильная, такой сигнатуры быть не может

Ok-ㅤ Автор вопроса
The Pressbraker
Классно! Не подумал от таком решении. А как сделат...

deduction guide нужно прописать для Overloded тогда и на ac++ 17 заработает

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта