【发布时间】:2014-11-22 10:32:30
【问题描述】:
我写了元组实现,似乎可行:
template<typename T, typename... U>
struct tuple{
T first;
tuple<U...> second;
tuple()=default;
tuple(T t, U... u):first(t), second(u...){}
std::ostream& print(std::ostream& stream){
stream<<first<<", ";
return second.print(stream); //not using << to avoid extra () in output
}
};
template<typename T>
struct tuple<T>{
T first;
tuple()=default;
tuple(T t):first(t){}
operator T&(){
return first;
}
std::ostream& print(std::ostream& stream){
return stream<<first;
}
};
template<typename... T>
inline auto mk_tuple(T... t){
return tuple<T...>(t...);
}
我以这种方式重载了operator<<:
template<typename... T>
std::ostream& operator<<(std::ostream &stream, tuple<T...> &out){
stream<<'(';
return out.print(stream)<<')';
}
当我尝试以这种方式使用它时:std::cout<<mk_tuple(1, 2, 3, "xyz", 'c'); 我明白了
error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
但是,mk_tuple(1, 2, 3, "xyz", 'c').print(std::cout) 有效。
(但不能令人满意,因为它在 C++ 中的语法并不明显)。
在这种情况下我应该如何重载operator<< 才能正确使用它?
【问题讨论】:
标签: c++ templates c++11 operator-overloading iostream