我正在尝试重载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>
表示法无效。
只是好奇是否有办法让后缀版本编译?或者也许是一些关于提取/插入运算符是否有意义的想法?
答案 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>
对象以允许此构造。