我正在尝试创建用于转换字符串的实用程序,因为我在各种容器(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 *
和std::string
,std::string
构造函数和赋值将在这两种类型之间不明确。并且我不想仅仅通过char *
,因为字符串最初可以通过范围而不是nul终止,需要额外的副本以获得nul终止,以及使嵌入的nuls不起作用。 / p>
那么有没有办法消除这些歧义?
重要提示:我遇到了一些C ++ 03编译器,因此无法将任何强制转换运算符标记为显式。
答案 0 :(得分:1)
在将make_x()
传递给函数参数之前,显式地转换std::string
const char*
,std::string y(static_cast<const char*>(make_x()));
或其他任何结果,e。 G:
struct X {
std::string str() { return std::string("string x"); }
const char *cstr() { return "zstring x"; }
};
std::string y(make_x().str());
如果你需要做很多事情并认为它冗长,请给予演员操作员简短名称:
{{1}}
如果这也是不可接受的,请根据您的目的调整safe bool idiom。
答案 1 :(得分:1)
我最终创建了一个带有强制转换操作符的帮助器给任何角色(char
,wchar_t
以及uint16_t
或uint32_t
,具体取决于wchar_t
是否为32或16位)指针类型和另一个带有强制转换操作符的助手到任何basic_string(专门用于上述任何一种,使用非标准类型的自定义特征)。这似乎在任何地方都不明确。