функцию ?
Можно пример псевдокодом, а то нихрена не понятно
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
std::function<void(…)> Это не работает, но надеюсь объяснит что я хочу сделать
ты хочешь класс, который можно будет вызвать с произвольным кол-вом аргументом?
Нет, я хочу массив функций с произвольным количеством аргументов. Зачем ? Я эти функции передам в библиотеку
то есть: std::vector functions = { std::function<void(int, float, double)>, std::function<void(int, bool, string)> }; ?
Да, грубо говоря
А прям точно массив требуется ? Это можно более элегантно сделать: #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; }
Супер, спасибо
Погоди, но ведь std::function<void(int, float, double) и std::function<void(int, bool, string) это разные типы. смотри на сигнатуры. Ты не положишь их в один и тот же контейнер. Иди запакуй их сначала в std::variant. Но потом тебе надо будет узнавать какой там лежит тип в варианте. Я кстати, не знаю, как узнать какой в нем std::function. Объект, наполненный перегрузками и скармиливать его в std::visit ? Не будет ли случайно когда совпадут какие то сигнатуры и компилятор не сможет выбрать правильную перегрузку? В одном контейнере ты не можешь хранить ни указатели на функции ни std::function с разными сигнатурами, ни тем более лямбды (даже с одинаковыми сигнатурами, так как две одинаковые внешне лямбды по факту разные классы!)
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Классно! Не подумал от таком решении. А как сделать, чтоб работало в 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 | }; | ^ "
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
У этой функции и сигнатура неправильная, такой сигнатуры быть не может
Читайте чат внимательно!
deduction guide нужно прописать для Overloded тогда и на ac++ 17 заработает
Обсуждают сегодня