我正在嘗試使字符串轉換爲實用程序,因爲在各種容器(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::string
的std::string
構造函數和賦值將是這兩種類型之間的曖昧。我不想僅僅通過char *
,因爲字符串最初可能是由範圍給出的,而不是以nul結尾,需要額外的拷貝才能得到nul終止的,並且使嵌入的nul不起作用。
那麼有什麼辦法來消除這些歧義?
重要注意事項:我被一些C++ 03編譯器卡住了,所以既不能將cast操作符標記爲顯式。
靜態轉換也不起作用。這是在問題中提到的。安全布爾成語依賴於類型的存在,該類型具有_implicit_轉換爲bool,但不存在向char *的隱式轉換。 –
是的,忘了關於安全布爾成語(大腦屁)的部分。我發現它很好奇,在這種情況下顯式的強制轉換不起作用,因爲我排除了他們調用相應的強制操作符(如果存在的話)。根據您的需要,成員函數可能是最簡單的清理解決方案。 –
函數調用轉換意味着「構建一個臨時的」,所以我並不感到驚訝,它和變量構造一樣模糊。我也希望'static_cast'只有在存在時才使用cast操作符,但不幸的是它只是執行相同的操作並嘗試所有的構造函數。 –