我正在尝试创建用于转换字符串的实用程序,因为我的接口(interface)混合不好,需要各种容器(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 结尾的字符串以及嵌入 nul不工作。
那么有什么办法可以消除这些歧义吗?
重要提示:我无法使用某些 C++03 编译器,因此两个强制转换运算符都无法标记为显式。
最佳答案
在将 make_x()
的结果作为函数参数传递之前,将其显式转换为 std::string
、const char*
或其他内容,e。例如:
std::string y(static_cast<const char*>(make_x()));
如果您需要经常执行此操作并认为它很冗长,请为强制转换运算符指定短名称:
struct X {
std::string str() { return std::string("string x"); }
const char *cstr() { return "zstring x"; }
};
std::string y(make_x().str());
如果这也 Not Acceptable ,请调整 safe bool idiom达到您的目的。
关于c++ - 当目标类有多个构造函数时消除强制转换运算符的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17059786/