2013-01-23 63 views
1

我目前正在製作一個小型庫,它可以訪問random.org並獲得隨機字符串或整數。儘管我已經遇到了一個小問題,但是設計明智,而且我無法決定哪兩種方法最好,所以我會寫下我關於兩者的想法,並提出我認爲與兩者都相關的問題。如何從void指針返回一個類型的指針,當類型已知

我現在有這樣一個結構:

typedef struct { 
char **array; 
size_t row; 
size_t col; 
size_t size; 
} MemoryStruct; 

這是我的「問題」的來源,因爲我現在已經在整數處理到我的圖書館加入。

可以看出,指針當前是一個字符指針,因爲我希望能夠處理污點整數和字符,我應該添加另一個指針 - 一個整數指針 - 或者我應該使它成爲一個空指針並使一個函數,將返回正確的指針類型?

增加一個整數指針將是最簡單的,但我不確定在未來的某個時間點可能會使用我的庫的人有多明顯,這就是他的程序出現故障的原因,因爲他在結構中使用了錯誤的指針。

然而,添加一個void指針意味着我將不得不做一個基於上下文的函數,它將返回一個正確類型的指針(如果這甚至可能 - 我真的不知道它是否是) ,這導致了這樣的問題:

哪個返回類型可以返回不同種類的指針的函數? (......很明顯,是一個無效的指針!)但是我仍然沒有將想要的類型包括在內以方便使用我的庫的程序員 - 這是將它放入僞代碼中,我想要做什麼。

pointer-with-type-info *fun(MemoryStruct *memory, RandomSession *session) 
switch case on session->type 
return pointer of appropriate type 

它應該加在這裏,從session-> type可以推斷出指針應該是哪個類型。

非常感謝您閱讀本文。

+1

是否可以使用C++和模板,還是僅限於使用C? – spartygw

+0

我寧願將它保留在C中,因爲我對此更加適應,而不是進入C++和模板。 –

+0

那麼你堅持使用void * –

回答

1

我明白你的問題的方式,你知道指針數據類型。我將使用void*而不是兩個指針,因爲您可以在以後添加更多數據類型而不創建更多字段。

要檢索正確的值,可以創建兩個函數:int getAsString(MemoryStruct, char** value)int getAsInteger(MemoryStruct, int &value)。如果成功,這些函數將返回一個非零值(true)。這樣,您不但可以檢索正確的值,還可以知道是否可以按照此數據類型檢索值。