Передайте аргументы, упакованные с параметрами, в std::queue, чтобы позже вызвать другую функцию

Я задал аналогичный вопрос ранее, не осознавая, что он недостаточно конкретен.

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

Что-то типа:

std::queue<SOMETHING> queue;
template <typename... Params>
void printLater(int a, int b, char* fmt, Params ...args) {
    queue.push(args);
}

template <typename... Params>
void print(int a, int b, char* fmt, Param ...args) {
    //whatever
}

void actuallyPrint() {
    //whatever
    print(queue.pop());
}

Контекст: я работаю с оборудованием, которое может обрабатывать запросы только каждые 50 мс, иначе они игнорируются. Моя цель - создать оболочку, которая автоматически добавит задержки, если я отправлю ее сразу несколько раз.

Мой запасной вариант, если я не могу это сделать, хотя я бы предпочел, чтобы это было просто sprintf (или эквивалент C++) в строку, сохраняю только строку в очереди и вызываю print() без всех аргументов.

1 ответ

Возможно, что-то вроде этого:

std::queue<std::function<void()>> queue;

template <typename... Params>
void printLater(int a, int b, char* fmt, Params ...args) {
    queue.push([=](){ print(a, b, fmt, args...); } );
}

void actuallyPrint() {
    queue.front()();
    queue.pop();
}
Другие вопросы по тегам