2015-03-13 80 views
0

關於支持和處理多個不同整數大小以及它們是否應被視爲獨立類型(如字符串vs int)或其他子集的一個子集的一般問題。具體來說,我正在考慮uint8_t和uint32_t。處理不同大小的整數

我想構建一個消息對象,我將用它來通過網絡發送消息。在最簡單的情況下,它將具有包含有效載荷大小和有效載荷的頭部。我有3種類型的數據要發送。

  1. 字符串數據,其中標頭是字符串的長度,有效負載是字符串。
  2. 1字節的整型數據,其中標頭爲1,有效載荷爲uint8_t。
  3. 4個字節的整數數據,其中標頭爲4,有效載荷爲uint32_t。

(其實我也用頭的一個位來標記它是一個int還是一個字符串類型,但這裏並不重要)。

在創建我的消息對象時,顯然我將字符串視爲不同於整數,並且它具有自己的構造函數來創建原始消息。我試圖確定處理不同類型整數的最佳做法。

我能:

  1. 分別對待。有兩個構造函數,一個接受uint8_t,另一個接受uint32_t。
  2. 將uint8_t視爲uint32_t的一個子集,並讓一個構造函數接受uint32_t,然後測試其最重要的三個字節是否爲零。

最終我想支持1,2,4和8個字節的整數,並且不喜歡在構造函數中使用擴散的想法,如果我選擇了1,一般構造函數並測試我傳遞的值以確定它應該是什麼類型。但是我想要做的是「正確」的事情。所以我的問題是......如果uint8_t和uint32_t被視爲不同的類型,就像字符串和uint8_t一樣。或者,將uint8_t作爲uin32_t的子集考慮是否是一種好的做法?

+0

爲什麼不使用第三派對網絡圖書館?它們通常具有流功能,例如push_int8 push_int32等。然後,您可以發送所需的成員。它甚至不必是相同的類型,如果你使用int來存儲對象中的小值。 – 2015-03-13 17:33:57

+1

我想說,第一個選擇是好方法。類型的目的是在編譯時攜帶信息;第二個選項會拋棄這些信息。我建議爲整型類型寫一個通用模板方法。 – lisyarus 2015-03-13 17:33:59

+0

消息對象是嚴格意義上的傳輸機制還是意圖傳輸類型?如果你爲不同的整數類型建立單獨的構造函數,你會得到錯誤,因爲整數可以隱式轉換。 – 2015-03-13 18:22:02

回答

0

正如我在評論中所說,第一個選項更好,因爲它使用了您擁有的類型信息。沒有必要爲uint8uint32等創建不同的消息構造函數;模板將幫助你。

這裏有一個通用的消息,構造函數,它適用於所有POD類型的例子:

template <typename T, typename = std::enable_if<std::is_pos<T>::value, void>::type> 
message create_message (T const & x) 
{ 
    message m; 
    m.write(&x, sizeof(T)); 
    return m; 
} 

(我假設你message類型有像write(void*, size_t)一些方法)