(从istream中提取并插入到ostream中)操作:是&gt;&gt; <t> os; </t>

时间:2014-04-06 11:33:17

标签: c++ templates stream operator-keyword

我正在尝试重载operator>>,以便从T中提取istream x;类型并插入ostream y;,即x >><T> y;

使用

template<class T> istream& operator>>(istream& is, ostream& os)
{
    T a;
    is >> a;
    os << a;
    return is;
}

前缀表示法operator>><string>(x,y);编译,但后缀表示法x >><string> y;无法编译

test.cpp:29:9: error: expected expression
    x >><string> y;
        ^
test.cpp:29:10: error: unexpected type name 'string': expected expression
    x >><string> y;
         ^
2 errors generated.

我认为>><T>表示法无效。

只是好奇是否有办法让后缀版本编译?或者也许是一些关于提取/插入运算符是否有意义的想法?

1 个答案:

答案 0 :(得分:1)

简短的回答,没有。运算符重载根据严格的语法规则进行,因此对于任何二元运算符@,表达式a @ b会考虑重载函数(a).operator@(b)operator@(a, b)

在你的情况下,正确的做法是创建一个包装器对象:

template <typename T> class pass
{
    std::ostream & os_;
public:
    pass(std::ostream & os) : os_(os) {}

    friend std::istream & operator>>(std::istream & is, pass & p)
    {
        T x;
        if (is >> x) { p.os_ << x; }
        return is;
    }

    friend std::istream & operator>>(std::istream & is, pass && p)
    {
        return is >> p;
    }
};

用法:

std::cin >> pass<int>(std::cout);

请注意,我们通过右值引用获取pass<T>对象以允许此构造。