Существует ли какой-либо рабочий аналог пары std::function и std::bind в Arduino?

pointer stl

И ArduinoSTL, и StandardCplusplus их не поддерживают. Они реализуют версию, совместимую с c++03 (не c++11).

Эта функция удобна при разработке библиотек, работающих с обратными вызовами. И они вам действительно нужны, если ваш Arduino делает более одной вещи одновременно.

Я попробовал также несколько других вариантов, но ни одного не было достаточно. Самое полное, что я нашел , Передавая захват лямбды в качестве указателя функции, не поддерживает простые указатели функций и не позволяет мне удерживать объект функции как член структуры, потому что тип объекта зависит от лямбды (а не только от ее сигнатуры, как в std::function).

В частности, мне нужен функтор, который

  • может хранить как захватывающие лямбды, так и простые функциональные обертки
  • имеет тип, который зависит только от сигнатуры функции, поэтому я могу хранить его как член класса.

, 👍6

Обсуждение

Ну, компиляторы 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


1 ответ


Лучший ответ:

2

Мы написали решение, которое опубликовали в виде библиотеки Platformio: https://github.com/fopeczek/function_objects.

Обратите внимание, что каждый функциональный объект выполняет одно распределение, и они не особенно удобны во встроенной среде. Я даже не уверен, что Arduino C++ выполняет освобождение кучи, так что вы можете утечь ресурсами, если создадите и уничтожите функциональные объекты в цикле.

,

Я изменил адрес хранилища - по ошибке я указал вам на старое и несуществующее. Правильный адрес-это https://github.com/fopeczek/function_objects, @Adam Ryczkowski