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

时间:2010-05-02 09:33:49

标签: c++ class implicit casting scalar

我有以下代码,它使用我正在编写的库中的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等)。

1 个答案:

答案 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更加冗长。