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

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

функцию ?

17 ответов

17 просмотров

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

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 заработает

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

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

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
как быть с принтером? такой подход прокатит?
zamtmn
12
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Карта сайта