如何定义从类到标量的隐式类型转换?

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等).

CB *_*ley 7

首先,我建议您考虑不提供隐式转换.您可能会发现意外转换未被捕获为错误的情况超过了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.