c++ - 是否可以修复可变参数模板函数的参数?

标签 c++ recursion

我想将可变数量的参数放入缓冲区,所以我重载了 <<将值插入给定缓冲区的运算符:

template<typename T, typename... Args>
void pack(T first, Args... args, std::vector<uint8_t> &buffer) {
    pack(args ..., buffer);
    buffer << first;
} 

void pack(std::vector<uint8_t> &buffer) { return; }

由于可变参数模板函数依赖于递归,我的想法是有一个返回缓冲区的基本情况和一个将第一个参数插入缓冲区的递归情况(在递归调用之后)。

但是,如果我运行如下代码:

std::vector<uint8_t> buffer;
pack((uint8_t)0xFF, (uint32_t)0x0A, buffer);
hex_dump(buffer);

我收到一条错误消息:

In file included from main.cpp:2:0:
./misc.hpp:20:6: note: candidate: template<class T, class ... Args> void pack(T, Args ..., std::vector<unsigned char>&)
 void pack(T first, Args... args, std::vector<uint8_t> &buffer);
      ^~~~
./misc.hpp:20:6: note:   template argument deduction/substitution failed:
main.cpp:35:47: note:   candidate expects 2 arguments, 3 provided
     pack((uint8_t)0xFF, (uint32_t)0x0A, buffer);

如何在递归情况下传递缓冲区,以便将值附加到部分填充的缓冲区?

最佳答案

更简单的方法是在第一个参数处设置缓冲区:

void pack(std::vector<uint8_t> &) {}

template<typename T, typename... Args>
void pack(std::vector<uint8_t> &buffer, T first, Args... args) {
    buffer << first;
    pack(buffer, args ...);
}

而在C++17中,使用Fold表达式,你可以直接写:

template<typename T, typename... Args>
void pack(std::vector<uint8_t> &buffer, Args... args) {
    (buffer << ... << args);
}

关于c++ - 是否可以修复可变参数模板函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45793322/

相关文章:

postgresql - 在postgres中的递归查询中排序

c++ - 为什么我没有 WGL_ARB_create_context 扩展?

javascript - 如何知道你的递归函数已经结束

javascript - 递归函数查找给定 id 的顶级父级

c++ - 圆线段碰撞 C++ (UE4)

java - 如何使用递归将元素从数组一复制到数组二?

c++ - 在任何编程语言中回溯

C++ 不能创建抽象类的实例

c++ - 在 C++ 中读取和写入 std::map 的线程安全

c++ - Qt按钮没有出现在主窗口中