通过"显式运算符X"进行类型转换对于static_cast或toX()?

时间:2017-11-06 00:15:43

标签: c++11 casting static-cast

之前有类似问题,但我能找到的所有问题都有不同的问题:

在决定如何在类上实现显式转换时,我应该考虑哪些事项?

在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()没有转换构造函数一样,所以这种区别并没有发挥作用。并且,它还允许在继承层次结构之间进行转换,但这也不会在这里发挥作用。

1 个答案:

答案 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.

请务必记录两种方法相同。