之前有类似问题,但我能找到的所有问题都有不同的问题:
static_cast<string>(x)
vs x.operator string()
static_cast
与c风格的演员表(通常称之为功能风格的演员表)在决定如何在类上实现显式转换时,我应该考虑哪些事项?
在c ++ 11中,我可以有一个显式转换运算符:
class myClass {
public:
explicit operator std::string() const {
...
}
};
const myClass x{...};
std::string str = static_cast<std::string>(x);
或者,我可以有一个函数toX()
:
class myClass {
public:
std::string toString() const {
...
}
};
const myClass x{...};
std::string str = x.toString();
我的一部分人认为他们是完全相同的,但我的一部分认为我必须缺少一些场景或最佳实践指南。
授予static_cast
允许拨打myClass::explicit operator std::string()
或std::string(myClass)
,但我会专注于做出决定以便在myClass
内进行转换。 {1}},就像std::string()
没有转换构造函数一样,所以这种区别并没有发挥作用。并且,它还允许在继承层次结构之间进行转换,但这也不会在这里发挥作用。
答案 0 :(得分:0)
我建议同时实现这两个,假设你的类足够“喜欢”一个字符串,转换为std::string
真的有意义。 (当然,一个成员函数可以调用另一个。)
当我想使用显式转换实际构造命名对象时,将其写为直接初始化有时会更自然:
std::string s1{ x }; // Plain conversion.
std::string s2 = x.toString(); // More verbose - could be good or bad
但是当我不需要命名对象时,调用成员函数比使用某种形式的强制转换更好看:
f( static_cast<std::string>(x) ); // Blah.
f( x.toString() ); // Convenient.
请务必记录两种方法相同。