我正在将int和float值加载到缓冲区以便传输数据。
一些例子:
void send_cmd_1(int y, int z, int a, int b)
{
int buf[5];
buf[0] = 1; // command #1
buf[1] = y; // parameters for command #1
buf[2] = z;
buf[3] = a;
buf[4] = b;
queue_command(buf); // function to queue command
}
send_cmd_2(float x, int a)
{
int buf[3];
buf[0] = cmd_id;
buf[1] = float_to_int(x);
buf[2] = a;
queue_command(buf);
}
我有很多(超过60个)函数接受命令ID,以及一些由int
和float
值组合而来的值。参数的数据类型由传输值的设备决定。
我无法控制。在每个函数中,执行类似于上面的代码来打包缓冲区,然后将缓冲区排队到另一个发送数据的线程。
我正在寻找一种更优雅的方式来做这个,而不是创建60个函数的强力方法,所有这些看起来都像上面的细微变化。
我发现可变参数模板可能是这种模式的一个很好的解决方案。
我希望语法结束如下:
send_cmd_1(int y, int z, int a, int b)
{
enqueue(1, y, z, a, b);
}
send_cmd_2(float x, int a)
{
enqueue(2, x, a);
}
{' enqueue()
'是一个可变函数或模板,它将采用命令id,并以正确的顺序混合int
和float
值,将参数打包到缓冲区并调用{{1}功能。
我需要帮助解决看起来像什么的问题。
queue_command()
如果&#39; template<typename... Args>
void enqueue(int cmd_id, Args... args)
{
int buf[sizeof...(Args)]
buf[0] = cmd_id;
for (int i = 1; i < sizeof...(Args); i++)
{
// what goes here?
}
queue_command(buf);
}
&#39;&#39; Args
&#39;是一个正确顺序的数据结构,我真的不需要做任何事情。只要字节的顺序正确,我就可以对它进行排队。
queue_command(args);
根据提议的解决方案,我最终得到了这个:
void enqueue(cmd_enum cmd_id, Args... args)
{
int buf[sizeof...(Args)+1U]{static_cast<int>(cmd_id), *reinterpret_cast<int*>(&args)...};
queue_command(buf);
}
这给了我我追求的目标。
void send_cmd_1(int y, int z, int a, int b)
{
enqueue(command_1_name, y, z, a, b);
}
Haven尚未测试过。如果它不起作用,我将发布更正。
答案 0 :(得分:3)
不确定理解您的要求,但我想您可以编写一组to_int()
函数,例如
int to_int (int i)
{ return i; }
int to_int (float f)
{ return float_to_int(f); }
并简单地编写您的可变参数enqueue()
函数,如下所示
template <typename ... Args>
void enqueue (int cmd_id, Args ... args)
{
int buf[sizeof...(Args)+1U] { cmd_id, to_int(args)... };
queue_command(buf);
}
观察+1
维buf
的维度:cmd_id
需要。