我想将可变数量的参数放入缓冲区,所以我重载了 <<
将值插入给定缓冲区的运算符:
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/