Существует ли какой-либо рабочий аналог пары std::function и std::bind в Arduino?
И ArduinoSTL, и StandardCplusplus их не поддерживают. Они реализуют версию, совместимую с c++03 (не c++11).
Эта функция удобна при разработке библиотек, работающих с обратными вызовами. И они вам действительно нужны, если ваш Arduino делает более одной вещи одновременно.
Я попробовал также несколько других вариантов, но ни одного не было достаточно. Самое полное, что я нашел , Передавая захват лямбды в качестве указателя функции, не поддерживает простые указатели функций и не позволяет мне удерживать объект функции
как член структуры, потому что тип объекта зависит от лямбды (а не только от ее сигнатуры, как в std::function
).
В частности, мне нужен функтор, который
- может хранить как захватывающие лямбды, так и простые функциональные обертки
- имеет тип, который зависит только от сигнатуры функции, поэтому я могу хранить его как член класса.
@Adam Ryczkowski, 👍6
Обсуждение1 ответ
Лучший ответ:
Мы написали решение, которое опубликовали в виде библиотеки Platformio: https://github.com/fopeczek/function_objects.
Обратите внимание, что каждый функциональный объект выполняет одно распределение, и они не особенно удобны во встроенной среде. Я даже не уверен, что Arduino C++ выполняет освобождение кучи, так что вы можете утечь ресурсами, если создадите и уничтожите функциональные объекты в цикле.
Я изменил адрес хранилища - по ошибке я указал вам на старое и несуществующее. Правильный адрес-это https://github.com/fopeczek/function_objects, @Adam Ryczkowski
- Полностью ли поддерживается C++ STL на Arduino?
- Почему считается плохой практикой использовать ключевое слово "new" в Arduino?
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Как заставить std::cout писать в Serial?
- Безопасно ли использовать std::array (из C++ STL) на Arduino? Использует ли он динамическое выделение памяти?
- Проблемы с преобразованием uint32_t в char*
- Как использовать лямбда-функции в Arduino?
- ArduinoJSON v6 – передача буфера как параметра функции
Ну, компиляторы ARM с поддержкой C++11 обычно имеют рабочую функциональную библиотеку и другие STL-материалы. Для AVR вы можете попробовать реализовать что-то свое или скопировать что-то вроде mbed (его онлайн-компилятор не поддерживает c++11, поэтому у них есть несколько не очень хороших классов-оболочек для обратных вызовов)., @KIIV
@KIIV Написание правильной замены
std::function
кажется мне очень пугающим. Знаете ли вы что-то уже написанное, что я могу использовать для хранения как захвата лямбд, так и указателей на функции?, @Adam RyczkowskiОн может делать только указатели функций и в качестве бонуса даже указатели методов, но это не для c++11, так что никаких лямбд., @KIIV
Хранение захваченных лямбд и указателей на функции потребует реализации некоторого рода стирания типов. И это именно то, что такое " std::function
. Вам придется реализовать некоторую версию " std::function
. Вы можете сделать упрощенную реализацию, но обойти ее невозможно. Хотя непонятно, почему вы утверждаете, что вам нужны обратные вызовы, чтобы делать "более одной вещи одновременно"., @AnTЯ имею в виду управляемое событиями исполнение, то есть кооперативную многозадачность. Я полагаю, вы не знаете, писал ли кто-нибудь такую библиотеку?, @Adam Ryczkowski
В целом это не является неразумным желанием. Меня только что попросили перенести фреймворк, который я написал на ESP8266, на ванильный Arduino, и угадайте, что - я широко использовал функцию std::для регистрации обратного вызова из-за элегантности и модульности, которые она позволяет. В тонком и легком окружении это чрезвычайно полезно., @Phil Haigh