我正在尝试制作用于转换字符串的实用程序,因为我在各种容器(char*、std::string、自定义字符串类型)和格式(utf-8、utf-16、utf-32)中需要字符串的接口组合不好. 所以我有想法创建一个包含各种类型的强制转换运算符的包装器。像这样:
#include <iostream>
#include <string>
struct X {
operator std::string() { return std::string("string x"); }
operator const char *() { return "zstring x"; }
};
X make_x() { return X(); }
int main()
{
std::string y = make_x(); // this works
std::string y(make_x()); // but this does not
y = make_x(); // this does not work either
y = std::string(make_x()); // nor does this, so it's about useless
std::cout << y << std::endl;
return 0;
}
但问题是,如果类型同时转换为char *
and std::string
,那么std::string
这两种类型之间的构造函数和赋值将是模棱两可的。而且我不想通过 just char *
,因为字符串可能最初是由范围给出的,而不是作为 nul 终止的,需要额外的副本来获得一个以 nul 终止的以及使嵌入的 nuls 不起作用。
那么有什么办法可以消除这些歧义吗?
重要提示:我被一些 C++03 编译器困住,所以这两个转换运算符都不能被标记为显式。