【问题标题】:Pass param packed args into a std::queue to call with a different function later将参数打包的 args 传递到 std::queue 以便稍后使用不同的函数调用
【发布时间】:2020-05-18 16:51:48
【问题描述】:

我之前问过一个类似的问题,但没有意识到这不够具体。

所以我有这个函数,它必须接收打印函数的所有参数,包括 ... 和所有,然后将其放入稍后将调用实际打印函数的队列中。

类似:

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()

【问题讨论】:

  • 我不知道你为什么发布了一个新问题而不是改进你的另一个问题。我将另一个投票选为与这个重复,因为它不够具体,无法真正回答,但显然是与此处相同的问题。
  • 在这些情况下,您应该做的是编辑您的第一个问题,包括附加信息。请注意,问题下方有一个链接:“编辑”,请尝试单击它。

标签: c++ templates queue parameter-passing pack-expansion


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 2014-08-31
    • 2019-04-14
    • 2018-06-23
    • 2022-11-02
    • 2020-11-11
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多