Del*_*ani 0 c++ scalar casting class implicit
我有以下代码,它使用我正在编写的库中的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());
}
Run Code Online (Sandbox Code Playgroud)
ustring类实例的encode方法将内部Unicode转换为UTF-8 char*.但是,因为我无法访问char类定义,所以我不确定如何定义隐式类型转换(因此我在使用printf时不必手动调用encode等).
首先,我建议您考虑不提供隐式转换.您可能会发现意外转换未被捕获为错误的情况超过了encode
您想要的时候的调用成本char*
.
如果您决定提供隐式转换,则将其声明为此类(在类定义中).
operator char*();
Run Code Online (Sandbox Code Playgroud)
您可以将方法设为const,在这种情况下您可以使用:
operator char*() const;
Run Code Online (Sandbox Code Playgroud)
通常,您还希望返回指向不可修改缓冲区的指针:
operator const char*() const;
Run Code Online (Sandbox Code Playgroud)
在你的函数体中你应该有return
一个合适的指针.作为隐式转换,客户端不会期望必须释放返回的缓冲区,因此如果需要为返回值创建特殊缓冲区,则必须维护指向此缓冲区的指针,直到找到合适的释放缓冲区为止.通常,这样一个合适的时刻可能是您的类对象的下一个变异操作.
请注意,要printf
获取任何数量和类型的可选参数,您仍然需要在任何情况下转换类对象.
printf("%s\n", static_cast<const char*>(a + b + c[1] + d));
Run Code Online (Sandbox Code Playgroud)
要么
printf("%s\n", (const char*)(a + b + c[1] + d));
Run Code Online (Sandbox Code Playgroud)
这两个都比显式调用更冗长encode
.