簡體   English   中英

沒有類的C ++用戶定義轉換運算符?

[英]C++ user-defined conversion operators without classes?

在C ++中是否可以定義非類成員的轉換運算符? 我知道如何為常規運算符(例如+)執行此操作,但不知道如何為轉換運算符執行此操作。

這是我的用例:我使用的是C庫, PA_Unichar *交給我,其中庫將PA_Unichar定義為16位int。 它實際上是一個用UTF-16編碼的字符串。 我想將它轉換為以UTF-8編碼的std::string 我已准備好所有轉換代碼並且正在工作,我只缺少允許我編寫的語法糖:

PA_Unichar *libOutput = theLibraryFunction();
std::string myString = libOutput;

(通常在沒有臨時變量的一行中)。

另外值得注意的是:

  • 我知道std::string沒有定義來自char*隱式轉換,我知道為什么。 同樣的原因可能適用於此,但這不是重點。

  • 我有一個ustringstd::string子類,它定義了PA_Unichar*的正確轉換運算符。 它可以工作,但這意味着使用ustring變量而不是std::string然后當我將這些字符串與其他庫一起使用時,需要轉換為std::string 所以這並沒有多大幫助。

  • 使用賦值運算符不起作用,因為它們必須是類成員。

那么可以在兩個你不能控制的類型(在我的例子中是PA_Unichar*std::string )之間定義隱式轉換運算符,它們可能是也可能不是類類型?

如果不是什么可以解決?

免費功能有什么問題?

std::string convert(PA_Unichar *libOutput);

std::string myString = convert(theLibraryFunction());

編輯回復評論:

正如DrPizza所說 :其他人都試圖通過隱式轉換來填補漏洞,用你稱之為“視覺混亂”的顯式轉換替換它們。

至於臨時字符串:只需等待下一個編譯器版本。 它可能帶有rvalue引用,它的std::string實現將在其上實現移動語義,從而消除了副本。 我還沒有看到一種更便宜的加速代碼的方法,而不僅僅是升級到新的編譯器版本。

無論如何,隱含的轉換是魔鬼。 使用轉換函數調用使其顯式化。

我不認為你可以定義“全局”轉換運算符。 標准說conversion functionsspecial member functions 如果我可以考慮以下語法糖,我會提出以下建議:

struct mystring : public string
{
    mystring(PA_Unichar * utf16_string)
    {
        // All string functionality is present in your mystring.
        // All what you have to do is to write the conversion process.
        string::operator=("Hello World!");
        string::push_back('!');
        // any string operation...
    }
};

請注意,此類的多態行為已被破壞。 只要你不通過string*類型的指針創建它的對象,你就是安全的! 所以,這段代碼是完美的:

mystring str(....);

如前所述,以下代碼被破壞了!

string* str = new mystring(....);
....
delete str; // only deleting "string", but not "mystring" part of the object
// std::string doesn't define virtual destructor

不,你不能。 你可以做的另一種方法是在目標類中創建一個轉換構造函數(不是你的情況,因為你想轉換為std :: string - 除非你派生它)。 但我同意其他答案,我認為在這種情況下不建議使用隱式轉換 - 特別是因為您不是從對象轉換而是從指針轉換。 最好有一個免費的功能,你的代碼將更容易理解,下一個繼承代碼的程序員肯定會感謝你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM