【问题标题】:Is the std::istream type EqualityComparable?std::istream 类型是 EqualityComparable 吗?
【发布时间】:2015-11-16 13:42:25
【问题描述】:

我的问题会有一个布尔答案:是或否。不管是哪一种,谁能解释一下下面的代码是如何被 GNU-g++ 4.9.2 和 clang 3.5 编译的,而 GNU-g++ 5.1.1 不再接受它,声称没有匹配的operator==

以及如何更改它,对于最后一个编译器,以便获得相同的结果,即让 operator>> 能够以如此简单的方式区分是否 它是由标准输入流调用还是由其他东西调用?

  # include <iostream>
  # include <fstream>

  struct S {};

  std::istream& operator >> (std::istream& i, S& s)
   {
    if(i == std::cin) std::clog << "this is standard input\n";
    else std::clog << "this is some other input stream\n";

    return i;
    }

  int main(int narg, const char ** args)
   {
    S s;
    std :: cin >> s;
    std::ifstream inp(args[1]);
    inp >> s;
    }
  // to be executed with the name of an existing
  // disk file on the command line....

【问题讨论】:

  • 我不明白流之间的相等可能意味着什么。身份,当然,但你有&amp;
  • @LightnessRacesinOrbit:一个合理(但完全假设)的例子是两个fstreams 比较相等,如果他们访问同一个文件。
  • @MSalters:我认为这没有意义。您只是在比较一个复杂得多的实体的一个属性。缓冲区呢?旗帜?输入/输出模式?光标?

标签: c++ c++11 equality istream


【解决方案1】:

没有。没有对 std::istream 对象进行操作的 operator==

您能够比较两个std::istreams 是std::istream,特别是operator void* 的转换功能造成的不幸后果。在表达式i == std::cin 中,istd::cin 都隐式转换为void*,并比较结果值。这并没有真正的意义。这个转换函数在 C++11 中被移除(替换为explicit 转换函数,在这种情况下不会被调用),所以如果启用 C++11 模式,代码将无法编译。

here所说,如果要检查引用i是否引用std::cin,可以使用&amp;i == &amp;std::cin

【讨论】:

    【解决方案2】:

    标准 C++ 流没有 ==&gt;&lt; 运算符,因为它们在这种情况下意义不大:“流 a 大于流 b”应该是什么意思?

    但是,您处理的是什么类型的 istream 并不重要:只要您不使用后代类中定义的特定方法(如 is_open),基本方法是共享的(提取、例如)。无论您是从istringstream 还是ifstream 中提取string,您只需执行in &gt;&gt; str 并让多态性起作用。

    如果你真的想知道istream 的多态类型,你可以使用typeid 或者简单的函数重载。在您的情况下,使用 RTTI(typeid)

    if ( typeid(in) == typeid(std::cin) )
        // cin
    else
       // another istream type
    

    使用重载:

    std::istream& operator >> (std::istream& i, S& s)
    {
         std::clog << "this is standard input\n";   
         return i;
    }
    
    std::ifstream& operator>>(std::ifstream& i, S& s)
    {
         std::clog << "this is some file input stream\n";
         return i;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 2011-06-10
      • 2020-07-29
      • 1970-01-01
      • 2015-09-14
      • 2019-07-12
      相关资源
      最近更新 更多