是否可以将参数修改为可变参数模板函数?

时间:2017-08-21 09:12:24

标签: 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);

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

1 个答案:

答案 0 :(得分:4)

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

[Authorize(Roles = "Domain\\ADGroup")]
public class HomeController : Controller

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

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