2012-07-05 123 views
2

我有三个结构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是一个指向我将阅读的(原始)数据的指针。我只需要这些非保留值,而不考虑保留的值。

+0

你能改变类型定义吗? – reuben

回答

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 s添加到print_data函数模板中,以确保T的数据成员类型是您所期望的类型,这是可以肯定的。

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

相关问题