2012-03-06 47 views
4

我想創建針對變異型結構的輔助包裝,所以這種類型的簽名會召喚必要的轉換,如:C++明確的函數簽名

variant CreateVariant(bool value); 
variant CreateVariant(int value); 
variant CreateVariant(char *value); 

問題是BOOL和INT的,因爲他們是隱式轉換類型...

因此,對於類似的代碼:

variant a = CreateVariant((BOOL)value); 
variant a = CreateVariant((__int64)value); 
variant a = CreateVariant(1); 

有一些問題。

如何設計一個乾淨的包裝,如果我需要作爲布爾和整數類型的布爾和未簽名的int/uints/longs/longlongs處理布爾?

對於類構造函數,我可以使用explicit關鍵字,但是我必須在我正在更新的代碼中使用函數int。

+6

我認爲這裏的問題是'BOOL'類型只是'int'的'typedef'。我不認爲在這種情況下有什麼辦法可以消除這兩者的歧義,儘管我可能是錯的。 – templatetypedef 2012-03-06 03:45:06

+0

我看不到問題。我嘗試用'bool','int'和'__int64_t'重載一個函數,並且每次都能夠區分每一個函數。 – howardh 2012-03-06 03:56:22

+0

@ howardh-請注意,該示例使用'BOOL'而不是'bool'。 'BOOL'是'int'的微軟'typedef',因此是這個問題。 – templatetypedef 2012-03-06 04:01:04

回答

1

正如評論所指,你的問題的答案在於區分「bool」(真正的布爾類型)和BOOL(int的MS類型定義)。

儘管如此,我在代碼中完成了完全相同的事情。如果您在MS平臺上,請考慮使用_variant_t或CComVariant:兩者基本上都是您想要的。我最終做了一個自己的轉換類,其模板通過默認的方式傳遞給底層的父類(本例中爲_variant_t),併爲沒有內聯轉換爲MS類類型的構造類型添加特化。您將不得不爲每種類型添加專業化,但在底層類型中沒有轉化,但通常不會太差。

我要補充:

優勢做這種方式的是,不會有隱式轉換。如果類型匹配顯式覆蓋,它將被使用。否則,它將匹配模板,並傳遞給MS類型。如果MS類型不能接受傳入的類型,那麼您將收到編譯時錯誤,並知道需要解決的問題。