是否可以将参数固定为可变参数模板函数?

Is it possible to fix an argument to a variadic template function?

本文关键字:参数 函数 变参 是否      更新时间:2023-10-16

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

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);
}