在通信缓冲区中混合int和float

时间:2017-08-31 12:39:54

标签: c++ c++11 templates variadic-templates

我正在将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,以及一些由intfloat值组合而来的值。参数的数据类型由传输值的设备决定。  我无法控制。在每个函数中,执行类似于上面的代码来打包缓冲区,然后将缓冲区排队到另一个发送数据的线程。

我正在寻找一种更优雅的方式来做这个,而不是创建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,并以正确的顺序混合intfloat值,将参数打包到缓冲区并调用{{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尚未测试过。如果它不起作用,我将发布更正。

1 个答案:

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

观察+1buf的维度:cmd_id需要。