2017-03-10 55 views
2

考慮以下的結構:是否可以將類型映射爲整數?

struct value{ 
    std::vector<UCHAR> raw_data; 
    int type; 
}; 

比方說類型的值可以是{0,1,2}在此示例中

如果type == 0,則在載體中的數據是代表一個4字節帶符號整數

如果類型== 1,則在載體中的數據是代表一個2字節符號整數

如果type == 2然後在矢量中的數據是任意長度

結構的格式是在我的掌握的原始字節的陣列,並且有類型超過30可能值。

是否可以在運行時確定類型?也許是這樣的僞代碼:

void PrintValue(value & v) 
{ 
    TypeLookup<v.type> val(v); // Assuming the type is supported by cout 
    std::cout << val << std::endl; 
} 

我目前在做什麼是一個大的switch敘述只要我使用的值,然後調用apropriate轉換方法例如:

int32_t GetValAs32Integer(); 
int16_t GetValAsShort(); 
std::vector<UCHAR> GetValAsRaw(); 

有沒有更eligant方式做這個?

+0

你在控制可以存儲的類型嗎?這些類是什麼類? –

+1

也許使用聯合來代替向量? – stakSmashr

+0

「結構的格式超出了我的控制範圍」 – user3853544

回答

2

有沒有更好的方法來做到這一點?

編號type的切換如此優雅。考慮到你只需要處理3個值,它應該足夠優雅。

+0

本示例僅在實踐中顯示3個可能的類型超過30個。 – user3853544

0

不,你不能這樣做。沒有「type」變量允許你將一個類型傳遞給一個函數。不過,除了在運行時切換變量類型的能力之外,模板幾乎可以爲您提供所需的所有功能。你可以專門化一個模板,並且可以創建包含任何類型的「auto」變量(但最終從模板或類型直接轉換爲源代碼)。

如果您發現需要使用C++進行動態輸入,最好的答案就是向上移動一級。創建或從Web獲取JSON(JavaScript對象表示法)解析器/包裝器,並在其中傳遞動態變量。然後你可以查詢字段和他們的類型,所以如果說一個國家的習俗與另一個國家的習俗不同,那麼有可能有一個「僱員」有或沒有「標題」字段,有些地方可以省略「Mr」字段其他人堅持這一點。

相關問題