2013-04-05 141 views
6

我有幾個字符串類可以隱式轉換爲字符串。我有這些用途的幾個;一個例子是,認爲需要在運行時gettext翻譯文本:隱式轉換的C++字符串類

class TranslatableString 
{ 
public: 
    explicit TranslatableString(const char *s) : native_text_(s) {} 
    operator const char *() const { return gettext(native_text_); } 

    // Or not - see below: 
    operator const std::string() const { return gettext(native_text_); } 

private: 
    const char * const native_text_; 
}; 

現在我想要使用這個類儘可能簡單(即製造,使用,應該儘可能多的像一個字符串字面儘可能)。我特別想爲以下兩個用法示例的工作:

const TranslatableString HELLO = TranslatableString("Hello, world!"); 

std::string ExampleA() { 
    return HELLO; 
} 

void ExampleB() { 
    std::string s; 
    s = HELLO; 
} 

有沒有什麼辦法讓這兩個例子中的工作?

  • 如果我有operator std::string,然後例B編譯失敗,他說,有std::string::operator=(const char *)std::string operator=(const std::string&)(這是有道理的)之間的歧義。
  • 如果我不包含operator std::string,則ExampleA無法編譯;顯然隱式地將TranslatableString轉換爲const char *爲std :: string是不允許的,儘管我不明白C++的隱式轉換規則足以解釋原因。

回答

5

每個轉換序列中只允許一個用戶定義的轉換,這就是爲什麼你不能「通過」const char*。 (請注意,const char*std::string也是用戶定義的轉換)。

您是否需要轉換爲const char*?沒有它(並與std::string蓋度),這兩個例子都可以。

也可能值得考慮在內部存儲數據std::string而不是const char*。您不必擔心釋放問題,您手中的數據「消失」等。

+0

有道理。謝謝。 (這個特殊的類只用於字符串文字,所以'const char *'很好;在其他地方,我幾乎總是使用'std :: string'。) – 2013-04-05 16:39:51

1

您必須放棄擁有operator const char *。請將其作爲explicit(C++ 11),或者將其作爲c_str方法提供。

不允許將TranslatableString轉換爲const char *std::string,因爲它包含兩個用戶定義的轉換。

相關問題