2010-05-02 15 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