簡體   English   中英

第三方類型之間的隱式轉換

[英]Implicit conversion between 3rd party types

有兩個類: AB 存在用於從類型A轉換為類型B和返回的算法。 我們無法觸及它們的源代碼。 我可以在兩種類型之間編寫隱式轉換嗎?

應該起作用的示例代碼:

B CalculateSomething(double x)
{
    A a(x);
    a.DoSomethingComplicated();
    return a;
}

不,我不這么認為。 隱式轉換通常使用重載運算符進行編碼。 它也適用於基類型。 由於您無法修改A和B代碼,因此無法告訴編譯器如何執行此操作。 您的代碼段會出錯。

你必須進行顯式轉換。 只是

return helper.convertToB(a);

MY2C

不,但你可以寫一個命名的自由函數來做到這一點。

B ToB( const A & a ) {
   B b;
   // process a somehow to add its data  to b
   return b;
}

然后你的代碼變成:

B CalculateSomething(double x)
{
    A a(x);
    a.DoSomethingComplicated();
    return ToB( a );
}

這可能比隱式轉換更清晰。

有兩個類:A和B.有從A類轉換為B類和返回類的算法。 我們無法觸及它們的源代碼。 我可以在兩種類型之間編寫隱式轉換嗎?

不,如果AB不相關,你就不能。 (而且我很感激。隱式轉換帶來了足夠的麻煩,因為它們無法為第三方類創建它們。)

不改變類定義是不可能的

即使你不能改變A或B的實現,你也可以在B的定義中添加一個內聯構造函數,它帶有一個const A&。

但我懷疑,除非這些類真的密切相關,否則提供一個顯式轉換函數會更好 - 隱式轉換可能是難以發現的錯誤的巨大來源:

B CalculateSomething(double x)
{
    A a(x);
    a.DoSomethingComplicated();
    return ConvertAToB( a );
}

暫無
暫無

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

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