流失败

题目描述

实现从标准输入读入空格分隔的整数的流 MyCin。与 std::cin 不同的是,它在遇到整数 -1 时触发输入失败;从而在下方代码的 while 循环中退出。

关于输入

若干行。每行两个空格分隔的整数。整数中存在 -1。

关于输出

对于首次 -1 出现之前的所有输入行,原样原序输出它们。此外,不输出任何其它内容。

即,程序遇到 -1 输入时退出。

参考答案

#include <iostream>

class MyCin { 
private:
    bool fail;

public:
    MyCin() : fail{false} {}
    MyCin& operator>>(int& n) {
        std::cin >> n;
        if (n == -1) {
            fail = true;
        }
        return *this;
    }
    explicit operator bool()const {
        return !fail;
    }
};

int main() {
    MyCin m;
    int n1, n2;
    while (m >> n1 >> n2) {
        std::cout << n1 << " " << n2 << std::endl;
    }
    // m << n1; // 编译错误
}

// 检查你是否正确解决了“m << n1 会通过编译”这个问题
template<typename,typename>struct J:std::
true_type{};template<typename T>struct J<
T, std::void_t<decltype(std::declval<int&
>()=std::declval<T&>())>>:std::false_type
{};static_assert(J<MyCin, void>::value);