我正在尝试使用自己的强制转换运算符编写一个类,但我遇到了多个operator=
s
我设法用下面的小代码重现了这个问题
#include <string>
class X
{
public:
operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
void func( )
{
X x;
std::string s = "";
s = x;
}
我理解std::basic_string
有多个赋值运算符,这就是编译器混淆的原因。
如果我删除任何一个强制转换操作符,它可以工作,但我想知道是否有办法保留两个操作符。
我的课程将根据演员表返回不同的值。
我也可以使用static_cast<std::string>(x)
强制演员,但我想知道是否有一种方法可以在没有静态演员的情况下进行演绎?
答案 0 :(得分:2)
作为KerrekSB suggested,您可以使用
s = (std::string) x;
// or
s = static_cast<std::string>(x);
或者,您可以执行演员表:
s = x.operator std::string();
第三种替代方案(由于可读性问题,我希望不会经常在野外看到)是直接访问运营商:
const char *
如果您愿意权衡稍微不同的API(并修复任何潜在的破坏),您可以执行Roberto suggested并强制显式 class X
{
public:
explicit operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
类型运算符:
std::string
这告诉编译器只允许隐式转换到const char *
,并且当你想调用那个特定的运算符时,需要你明确地转换为class X
。
最后要注意的一点是:如果你正在设计其他会消耗这个特定类的类或方法,那么另一个要尝试的方法是通过为X
提供重载来反转它们的使用方式。而不是将hash = {:foo =>{"string0"=>1, "string1"=>2}, :bar => {"string0"=>3, "string1"=>4}}
Hash[*hash.max_by { |_k, v| v['string0'] }]
#=> {:bar=>{"string0"=>3, "string1"=>4}}
转换为其他内容。
总是很好地考虑API的替代方法。
答案 1 :(得分:2)
如果在char * cast上使用explicit
关键字,则默认转换为std :: string。
class X
{
public:
explicit operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
之后你的演员阵容:
X x;
std::string s = "";
s = x;
会成功(如果他想使用其他演员,你的班级用户需要指定char * cast)
任何方式,作为你班级的用户,如果两个演员都是明确的,我宁愿选择,所以我知道什么时候正在进行演员