2012-07-05 47 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指向的數據不能保證正確對齊所有目標類型,則需要將帶有字節副本的轉換替換爲適當對齊緩衝。

相關問題