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

C++ 如何定义从类到标量的隐式类型转换?,c++,class,implicit,casting,scalar,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()); } #包括 #包括“ucpp” main()

我有以下代码,它使用我正在编写的库中的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());
}
#包括
#包括“ucpp”
main(){
ustring a=“测试”;
ustring b=“ing”;
ustring c=“-”;
d;
d=“cafe\xcc\x81”;
printf(“%s\n”,(a+b+c[1]+d).encode());
}

ustring类实例的encode方法将内部Unicode转换为UTF-8字符*。但是,因为我没有访问Car类定义,所以我不能确定如何定义隐式类型(这样就不用在使用PrtTF等时手动调用Enc码)。您可能会发现,当您需要
char*
时,意外转换不会被捕获为错误的情况超过了调用
encode
的成本

如果您决定提供隐式转换,您可以这样声明它(在类定义中)

operator char*();
您可以将方法设置为常量,在这种情况下,您可以使用:

operator char*() const;
通常,您还希望返回指向不可修改缓冲区的指针:

operator const char*() const;
在函数体中,您应该
返回
一个合适的指针。作为隐式转换,客户端不需要释放返回的缓冲区,因此,如果需要为返回值创建一个特殊缓冲区,您必须保留指向该缓冲区的指针,直到合适的点释放它。通常,这样一个合适的指针可能是类对象上的下一个变异操作

请注意,由于
printf
接受任意数量和类型的可选参数,因此在任何情况下都需要强制转换类对象

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

这两种方法都比直接调用
encode

要详细得多,非常感谢您的建议。我将考虑利弊,并测试隐式方法是否真的有益。(很抱歉,现在还没有接受您的答案;这也限制了我的接受频率,因此我不得不等待几分钟)@Delan Azabani:你不必马上接受答案;等着看是否有人能想出比我更好的答案是可以的。特别是对于字符串类,隐式转换为
char*
是非常有问题的。即使是像
str[i]
这样简单的东西现在也可能变得模棱两可。类似于
c?str:“foo”
。隐式转换首先不会为
printf
调用,因为此函数接受您向其抛出的任何类型。因此您已经输掉了这场战斗。。。
printf("%s\n", (const char*)(a + b + c[1] + d));