2013-06-12 44 views
2

我正在嘗試使字符串轉換爲實用程序,因爲在各種容器(char *,std :: string,自定義字符串類型)和格式中需要字符串的接口的組合不好(utf-8,utf-16,utf-32)。所以我有想法創建一個包含各種類型的演員操作符的包裝器。就像這樣:當目標類有多個構造函數時消除歧義cast操作符

#include <iostream> 
#include <string> 

struct X { 
    operator std::string() { return std::string("string x"); } 
    operator const char *() { return "zstring x"; } 
}; 

X make_x() { return X(); } 

int main() 
{ 
    std::string y = make_x(); // this works 
    std::string y(make_x()); // but this does not 
    y = make_x(); // this does not work either 
    y = std::string(make_x()); // nor does this, so it's about useless 
    std::cout << y << std::endl; 
    return 0; 
} 

但問題是,如果類型轉換成兩個char *std::stringstd::string構造函數和賦值將是這兩種類型之間的曖昧。我不想僅僅通過char *,因爲字符串最初可能是由範圍給出的,而不是以nul結尾,需要額外的拷貝才能得到nul終止的,並且使嵌入的nul不起作用。

那麼有什麼辦法來消除這些歧義?

重要注意事項:我被一些C++ 03編譯器卡住了,所以既不能將cast操作符標記爲顯式。

回答

1

我結束了創建一個幫手採用鑄造操作者的任何字符(取決於wchar_t是否是32位或16位charwchar_t並且或者uint16_tuint32_t)指針類型和轉換運算符另一個幫手任何的basic_string(專用於任何以上,使用非標準類型的自定義特徵)。這似乎在任何地方都不明確。

1

make_x()的結果明確地轉換爲std::string,const char*或其他值,然後將它作爲函數參數傳遞,摹:

std::string y(static_cast<const char*>(make_x())); 

如果你需要做這個有很多,並認爲它冗長,給投運營商短名稱:

struct X { 
    std::string str() { return std::string("string x"); } 
    const char *cstr() { return "zstring x"; } 
}; 

std::string y(make_x().str()); 

如果這是不可接受的也適應safe bool idiom到你的目的。

+0

靜態轉換也不起作用。這是在問題中提到的。安全布爾成語依賴於類型的存在,該類型具有_implicit_轉換爲bool,但不存在向char *的隱式轉換。 –

+0

是的,忘了關於安全布爾成語(大腦屁)的部分。我發現它很好奇,在這種情況下顯式的強制轉換不起作用,因爲我排除了他們調用相應的強制操作符(如果存在的話)。根據您的需要,成員函數可能是最簡單的清理解決方案。 –

+0

函數調用轉換意味着「構建一個臨時的」,所以我並不感到驚訝,它和變量構造一樣模糊。我也希望'static_cast'只有在存在時才使用cast操作符,但不幸的是它只是執行相同的操作並嘗試所有的構造函數。 –

相關問題