2010-05-02 53 views
0

我有以下代碼,它使用一個Unicode字符串類從我正在寫一個庫:如何定義從我的類到標量的隱式類型轉換?

#include <cstdio> 
#include "ucpp" 
main() { 
    ustring a = "test"; 
    ustring b = "ing"; 
    ustring c = "- -"; 
    ustring d; 
    d = "cafe\xcc\x81"; 
    printf("%s\n", (a + b + c[1] + d).encode()); 
} 

的ustring類實例的編碼方法的內部的Unicode轉換爲UTF-8字符*。然而,由於我沒有訪問char類定義,所以我不確定如何定義一個隱式類型轉換(這樣在使用printf等時不需要手動調用編碼)。

回答

7

首先,我會建議您考慮不提供隱式轉換。您可能會發現,當您想要char*時,未能發現意外轉換的情況會因爲錯誤而超過撥打encode的成本。

如果你決定提供一個隱式轉換聲明它是這樣的(你的類定義

operator char*(); 

您也許能夠使該方法常量,在這種情況下,你可以使用:

operator char*() const; 

通常你也想返回一個指向不可修改的緩衝區:

operator const char*() const; 

在你的函數體中,你應該使用return一個合適的指針。作爲隱式轉換,客戶端不會期望釋放返回的緩衝區,所以如果您需要爲返回值創建一個特殊緩衝區,則必須保留一個指向此緩衝區的指針,直到釋放它爲止。通常,這樣的合適時刻可能是您的類對象的下一個變異操作。

請注意,由於printf接受任何數量和類型的可選參數,所以在任何情況下仍然需要轉換類對象。

printf("%s\n", static_cast<const char*>(a + b + c[1] + d)); 

printf("%s\n", (const char*)(a + b + c[1] + d)); 

這兩者都是比encode的顯式調用更詳細。

+0

+1比我的更好的解釋:) – AraK 2010-05-02 09:42:07

+0

非常感謝您的建議。我會考慮利弊,並測試一個隱含是否真的有益。 – 2010-05-02 09:43:15

+0

(對不起,尚未接受您的答案;因此限制了我的接受頻率,所以我必須等幾分鐘) – 2010-05-02 09:45:23

相關問題