2

我有三个结构header,dataAdataB。将header确定将使用的结构。dataA和具有几乎相同的dataB结构(比方说):

struct dataA
{
    int   intValue;
    char  reserved1[8];
    float floatValue;
    char  reserved2[4];
    short shortValue;
};

struct dataA
{
    int   intValue;
    short shortValue;
    char  reserved[2];
    float floatValue;
};

我想像这样打印它:

sprintf(outStr, "%i, %f, %s", p->intValue, p->floatValue, p->shortValue);

- 或者 -

sprintf(outStr, "%i, %f, %s", p.intValue, p.floatValue, p.shortValue);

我该如何申报p?(注意:两者dataAdataB结构都很大,但数据几乎相同,但保留值除外。)

我在想这样的事情:

void * p;

if (header->type==1)
   p = (dataA*)(pData);
else if (header->type==2)
   p = (dataB*)(pData);

// print all data here

注意:这里pData是指向我将被读取的(原始)数据的指针。我只需要那些非保留值并忽略保留值。

4

1 回答 1

7

将打印逻辑移动到函数模板中:

template <typename T>
int print_data(char* const str, std::size_t const len, T const* const p)
{
    return std::snprintf(
        str, len,
        "%i, %f, %s",
        p->intValue, p->floatValue, p->shortValue);
}

然后从您的切换逻辑中调用此函数:

if (header->type==1)
    print_data(str, len, static_cast<dataA const*>(pData));
else if (header->type==2)
    print_data(str, len, static_cast<dataB const*>(pData));

如果您打算使用std::snprintf,最好将static_asserts 添加到print_data函数模板中,以确保数据成员T的类型是您期望的类型,只是为了确定。

请注意,如果您的平台有严格的对齐要求,并且pData不能保证指向的数据对于您的所有目标类型都正确对齐,则需要将强制转换替换为字节副本到适当对齐的缓冲区中。

于 2012-07-05T03:58:38.423 回答