指向两种不同结构的指针

时间:2012-07-05 03:55:12

标签: c++ pointers structure

我有三个结构headerdataAdataBheader将确定将使用的结构。 dataAdataB具有几乎相同的结构(让我们说):

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这里是指向我将要阅读的(原始)数据的指针。我只需要那些非保留的值并忽略保留的值。

1 个答案:

答案 0 :(得分: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_assert添加到print_data功能模板,以确保{{1}的数据成员类型是你期望的类型,只是为了确定。

请注意,如果您的平台具有严格的对齐要求并且T指向的数据无法保证为所有目标类型正确对齐,则需要将转换为字节副本替换为一个适当对齐的缓冲区。