如何为任意类型的任意数量的参数创建函数或宏

How to make function or macros for any count of arguments with any types?

本文关键字:参数 创建 函数 任意数 任意 类型      更新时间:2023-10-16

有客户端和服务器。我使用boost::serialization发送和接收数据。通常发送几个不同类型的参数。是否有方法可以为此制作函数或宏?

例如send(argType1, argType2, argType3);

我想我不会一次发送超过5个参数。

这是我的版本

template<class T>
int sendData(SSL *ssl, int command, T t)
{
    std::string serialData;
    OByteStream obs(serialData);
    obs << command;
    obs << t;
    obs.flush();
    return SSL_write(ssl, &serialData[0], BUF_SIZE);
}
template<class T1, class T2>
int sendData(SSL *ssl, int command, T1 t1, T2 t2)
{
    std::string serialData;
    OByteStream obs(serialData);
    obs << command;
    obs << t1;
    obs << t2;
    obs.flush();
    return SSL_write(ssl, &serialData[0], BUF_SIZE);
}
template<class T1, class T2, class T3>
int sendData(SSL *ssl, int command, T1 t1, T2 t2, T3 t3)
{
    std::string serialData;
    OByteStream obs(serialData);
    obs << command;
    obs << t1;
    obs << t2;
    obs << t3;
    obs.flush();
    return SSL_write(ssl, &serialData[0], BUF_SIZE);
}
...

如果您阅读了教程,您将发现大多数序列化器背后的思想是,在任何地方描述应用程序定义的类型和对象。这是用于boost的,比如:

class xyz
{
    int a;
    std::string b;
    std::vector<int> c;
    ...
    Serialization_Method(serializer_type &ser)
    {
       ser & a;
       ser & b;
       ser & c;
    }
}

这就结束了你可以序列化你的类型的可能性:

ser & xyz_obj;

如果你可以用你的序列化方法定义你的对象,你可以间接地发送/接收你需要的所有数据。描述总是在其中一个序列化方法中完成。

你发送没有任何描述的"任何东西"的想法永远不会奏效,也永远不会奏效。这很简单,因为你的接收者必须知道该把数据放在哪里。如果你认为接收方有一个程序片段,而我们认为我们可以接收到"一些东西"。我们应该如何处理这类数据?您的代码必须至少了解由您的代码和共同赞助数据表示的类和对象。如果您收到"一些未定义的"数据,则无法处理此数据!这结束于双方的数据和序列化结构的定义。对于boost,只需使用serializer_obj & serializer_data;语句即可完成。