Понимание значения '[](){ /* Code */ }' в аргументе
У меня есть этот кусок кода из библиотеки, и я пытаюсь понять 3-й аргумент, я искал Google изо всех сил и не смог найти никаких учебников или ссылок на языке C/C++ об этом.
timeOutTask.set(NODE_TIMEOUT, TASK_ONCE, [self = this->shared_from_this()]() {
Log(CONNECTION, "Time out reached\n");
self->close();
});
В частности, я пытаюсь восстановить этот фрагмент кода, который использует вышеупомянутый метод.
blinkNoNodes.set(BLINK_PERIOD, (mesh.getNodeList().size() + 1) * 2, []() {
// If on, switch off, else switch on
if (onFlag)
onFlag = false;
else
onFlag = true;
blinkNoNodes.delay(BLINK_DURATION);
if (blinkNoNodes.isLastIteration()) {
// Finished blinking. Reset task for next run
// blink number of nodes (including this node) times
blinkNoNodes.setIterations((mesh.getNodeList().size() + 1) * 2);
// Calculate delay based on current mesh time and BLINK_PERIOD
// This results in blinks between nodes being synced
blinkNoNodes.enableDelayed(BLINK_PERIOD -
(mesh.getNodeTime() % (BLINK_PERIOD*1000))/1000);
}
});
Мой вопрос сводится к тому, что на самом деле делает [](){ /*Code*/ }
в аргументе функции?
1 ответ
▲ 0
Как любезно указал КИИВ, это связано с лямбда-функциями
,
@Richard Haes Ellis
пожалуйста, объясните в своем ответе, @jsotola
Смотрите также:
- Как улучшить этот Код? (или как передать строку Char в функцию, чтобы она вела себя как переменная)
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Как работать с аналоговыми контактами в цикле?
- Какие есть другие IDE для Arduino?
- Как использовать переменные и функции в нескольких файлах .ino
- Разница между void setup() и void setup(void)
[Лямбда-функции](https://en.cppreference.com/w/cpp/language/lambda), @KIIV
Спасибо, что указали мне правильное направление, закрою вопрос., @Richard Haes Ellis
Кстати, если вы используете Arduino на основе AVR, вы ничего не сможете захватить, так как он больше не может быть преобразован в указатель функции. Однако на платах на базе ARM вы можете использовать std::функцию, labmdas с захватами или даже std::привязку для создания обратных вызовов, @KIIV