2010-10-24 81 views
4

我正在慢慢地學習成爲一名更好的C++程序員,而且我目前正在討論爲C庫實現包裝程序的最佳方法。該庫是一個壓縮文件格式的包裝器,可以存儲各種類型的標籤(char *,char,double,float,int32_t)。這些類型存儲爲uint8_t *,並且有一些輔助方法可將這些標記轉換爲適當的類型。例如:在C++類中包裝C類庫,並進行類型轉換

char tag2char(const uint8_t *v); 
char* tag2string(const uint8_t *v); 
uint32_t tag2int(const uint8_t *v); 

等等。

我對模板沒有太多的經驗,但是值得用類似於boost program options的方式將這些方法包裝在模板函數中嗎?即。 wrapper[tag].as<uint32_t>();還是應該實現每種標記轉換方法,並讓用戶自己調用適當的方法?還是有更好的辦法可以處理這個問題?

感謝您的幫助。

+0

該方法看起來相當低級別。圖書館能告訴你標籤是什麼類型?包裝的預期用途是什麼? – 2010-10-24 21:42:36

+0

圖書館確實告訴你標籤是什麼。大多數情況下,包裝器的使用是爲了能夠訪問/修改這些標籤(以及存儲在數據中的一些其他信息)。 – GWW 2010-10-24 21:47:23

回答

4

您可以使用這個模板,它不需要包裝類。只是專門功能模板:

template <typename T> 
T tag_to(const uint8_t *v); 

template <> 
char tag_to<char>(const uint8_t *v) { ... } 

template <> 
char* tag_to<char*>(const uint8_t *v) { ... } 

template <> 
uint32_t tag_to<uint32_t>(const uint8_t *v) { ... } 

... 

uint32_t i = tag_to<uint32_t>(tag); 
1

在C++中,可以使用具有相同名稱但參數不同的函數。您提到的功能是超載的理想選擇。無需模板。當所有函數具有相同的名稱時,包裝庫的用戶只需要記住更少的事情。

+3

如果函數僅在返回類型上有所不同,則不能重載。你必須通過參考,這很醜陋。 – 2010-10-24 21:16:51

+2

你不能重載這些,因爲它們都有相同的簽名。 – 2010-10-24 21:17:18

+0

OMG,我完全錯過了它。 – Dialecticus 2010-10-25 08:24:12

4

模板方法聽起來很合理,因爲無論如何,除非通過引用(yuck)傳遞,否則必須將類型的名稱放在某處

我不支持按引用傳遞,因爲它使函數不如子表達式有用。