【问题标题】:Type conversion by "explicit operator X" for static_cast or toX()?通过“显式运算符 X”对 static_cast 或 toX() 进行类型转换?
【发布时间】:2018-04-18 02:09:57
【问题描述】:

以前有类似的问题,但我能找到的所有问题都提出了不同的问题:


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

在 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 内进行转换的地方,例如@987654332 @ 没有转换构造函数,因此这种区别不起作用。而且,它还允许在继承层次结构之间进行强制转换,但这在这里也不起作用。

【问题讨论】:

    标签: c++11 casting static-cast


    【解决方案1】:

    我建议同时实现这两个,假设你的类足够“喜欢”一个转换为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.
    

    请务必证明这两种方法是相同的。

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2017-01-23
      • 2014-09-08
      • 2011-10-25
      相关资源
      最近更新 更多