【问题标题】:Stream operator and controlling conversion priority流运算符和控制转换优先级
【发布时间】:2016-02-19 10:37:50
【问题描述】:

我有一个流式基类:

class Stream
{
   virtual Stream& operator<< ( float num ) = 0;
   virtual Stream& operator<< ( double num ) = 0;
   virtual Stream& operator<< ( bool val ) = 0;
};

然后我实现一个实现类:

class StreamImpl : public Stream
{
   Stream& operator<< ( float num  ) { ... do stuff ... }
   Stream& operator<< ( double num ) { ... do stuff ... } 
   Stream& operator<< ( bool val   ) { ... do stuff ... }
};

然后对于新类,我创建我的非成员流运算符函数:

class Blar { };

Stream& operator<< ( Stream& str, const Blar& blar ) { ... do stuff ... }

一切正常,花花公子。但我有一个问题,在某些情况下编译器不知道使用哪个流操作符。

考虑 Blar 何时具有强制转换运算符:

class Blar 
{
    operator bool() const {  return false; }
};

现在我尝试使用流:

void process( Stream& str )
{
    Blar blar;
    str << blar;
}

所以这里的问题是编译器不知道是否应该将 Blar 转换为 bool,然后使用 Stream 成员,或者将 str 转换为 Stream 类型,并使用非成员流运算符。

有没有办法确定演员表的优先级?

【问题讨论】:

  • 制作operator bool()函数explicit
  • 很好的答案——它会起作用——但在这种情况下,我仍然希望隐式转换起作用。我只是希望它的优先级较低。
  • 应该可以。可能是你的编译器有问题。在ideone.com/GoHnd8 上查看它。它也可以在 cygwin/g++ 4.9.3 下运行。
  • 我确定确实如此。但是,如果我添加显式,那么每次我希望强制转换发生时我都必须手动进行转换,对吗?我写了“bool b = (bool)blar;”,对吧?
  • 对。我正在寻找“bool b = blar;”的解决方案仍然可以工作。

标签: c++ inheritance virtual-inheritance


【解决方案1】:

这个模板和 SFINAE 东西有望消除歧义(通过为从 Stream 派生的每个类定义 operator&lt;&lt;,这消除了 str &lt;&lt; blar 左侧的隐式转换):

// the following operator could potentially be defined in the template below, I'm just extending your code
Stream& operator<< (Stream& str, const Blar& blar) { /* something */ return str; }

template <
    typename Str,
    typename = typename std::enable_if<
        std::is_base_of<Stream, Str>::value &&
        !std::is_same<Stream, Str>::value
    >::type
>
Stream& operator<< (Str& str, const Blar& blar) { return static_cast<Stream&>(str) << blar; }

但是,即使对我来说,它看起来也只是一团糟,需要审查 - 也许@R Sahu 会这样做?

【讨论】:

    猜你喜欢
    • 2019-05-15
    • 2017-07-04
    • 1970-01-01
    • 2012-05-04
    • 2021-01-01
    • 2011-06-21
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多