我试图写一个类,我自己投运营商,但我有多个问题operator=小号
我设法用下面的小代码重现了这个问题
#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;
}
Run Code Online (Sandbox Code Playgroud)
我知道std::basic_string有多个赋值运算符,这就是编译器混淆的原因.
如果我删除任何一个强制转换运算符,它可以工作,但我想知道是否有一种方法可以保留两个运算符.
我的班级将根据演员表返回不同的值.
我也可以使用static_cast<std::string>(x)强制演员,但我想知道是否有一种方法可以在没有静态演员的情况下进行演绎?
正如 KerrekSB建议的那样,您可以使用
s = std::string(x);
Run Code Online (Sandbox Code Playgroud)
或者,您可以执行强制转换:
s = (std::string) x;
// or
s = static_cast<std::string>(x);
Run Code Online (Sandbox Code Playgroud)
第三种选择(由于可读性问题,我希望不要经常看到)是直接访问操作符:
s = x.operator std::string();
Run Code Online (Sandbox Code Playgroud)
如果您愿意权衡稍微不同的 API(并修复任何潜在的损坏),您可以按照 Roberto 的建议进行操作,并强制仅显式转换类型const char *运算符:
class X
{
public:
explicit operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
Run Code Online (Sandbox Code Playgroud)
这告诉编译器只允许隐式转换为,并要求您在想要调用该特定运算符时std::string显式转换为。const char *
最后要注意的一点是:如果您正在设计将使用此特定类的其他类或方法,则要尝试的另一件事是通过提供重载而class X不是转换X为其他内容来反转它们的使用方式。
考虑 API 的工作替代方式总是好的。
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |