我有以下代码,它使用我正在编写的库中的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类实例的encode方法将内部Unicode转换为UTF-8 char *。但是,因为我无法访问char类定义,所以我不确定如何定义隐式类型转换(因此在使用printf时我不必手动调用encode等)。
答案 0 :(得分:7)
首先,我建议您考虑不提供隐式转换。您可能会发现,如果您想要encode
,则意外转换未被捕获的错误超过了调用char*
的费用。
如果你决定提供隐式转换,你可以像这样声明它(在你的类定义中。
operator char*();
您可以将方法设为const,在这种情况下您可以使用:
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
更加冗长。