2015-09-14 122 views
2

我有類似下面的代碼正確的方法:什麼是對付模棱兩可的類型轉換/轉換C++ 11

class Pair{ 
public: 
    Pair(const void *blob); 
    //... 
    int cmp(const std::string &key) const; 
    int cmp(const Pair &pair) const; 
} 

後來如果我這樣做:

Pair p = ...; 
p.cmp("Hello"); 

它不會編譯,因爲從const char *轉換是不明確的。

它可以轉化爲std::stringcmp(std::string)被調用,或...

它可以轉化爲Paircmp(const Pair)被調用。我不能做構造函數explicit

我試圖做的:

Pair(const char *blob) = deleted; 

但我不能nullptr建設類,我希望能夠這樣做。

作爲最終的溶液中,我定義下面的方法:

int cmp(const char *key) const{ 
    return cmp(std::string{ key }); 
} 

並能正常工作。

是否有更好的方法來處理這樣的類轉換?

+4

「但是我不能用nullptr構造類,我希望能夠這樣做。」 - 讓你的一個構造函數採用'nullptr_t' –

回答

4

你的「最終解決方案」看起來相當不錯。不構建臨時性也將有助於提高性能。如果你的字符串是已知不包含NULL字符,你可以實現的版本採取了std::string的參數作爲

inline int 
cmp(const std::string& s) 
{ 
    return this->cmp(s.c_str()); 
} 

這是太簡單了,不用擔心。

製作Pair的構造函數explicit(我假設「implicit」是一個錯字)對我來說也是一個好主意。你爲什麼不能做到這一點?

+0

明確是錯字。我喜歡能夠做'Pair p = mem_ptr;'對我來說看起來不錯並且乾淨。沒有臨時使用非標準的StringRef類。 – Nick

+1

使用'explicit' c'tor,你仍然可以寫'Pair p {mem_ptr};'。看起來更好,更清潔。 ;-) – 5gon12eder

3

您可以使構造函數explicit

explicit Pair(const void *blob) { ... } 

然後,

p.cmp("Hello"); 

將解析爲

int cmp(const std::string &key) const; 
+0

明確是錯字。對不起 – Nick