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 类实例的 encode 方法将内部 Unicode 转换为 UTF-8 char *。但是,因为我无权访问 char 类定义,所以我不确定如何定义隐式类型转换(这样我就不必在与 printf 等一起使用时手动调用编码)。

4

1 回答 1

7

首先,我建议您考虑不提供隐式转换。您可能会发现未将意外转换作为错误捕获的情况超过了encode在需要char*.

如果你决定提供一个隐式转换,你可以像这样声明它(在你的类定义中。

operator char*();

您也许可以将方法设为 const,在这种情况下,您可以使用:

operator char*() const;

通常你还想返回一个指向不可修改缓冲区的指针:

operator const char*() const;

在你的函数体中,你应该return有一个适当的指针。由于隐式转换客户端不希望释放返回的缓冲区,因此如果您需要为返回值创建一个特殊的缓冲区,则必须维护指向该缓冲区的指针,直到合适的点释放它。通常,这样一个合适的时刻可能是您的类对象上的下一个变异操作。

请注意, asprintf需要任何数量和类型的可选参数,您仍然需要在任何情况下转换您的类对象。

printf("%s\n", static_cast<const char*>(a + b + c[1] + d));

或者

printf("%s\n", (const char*)(a + b + c[1] + d));

这两者都比显式调用更冗长encode

于 2010-05-02T09:40:27.860 回答