这个怎么样:
struct MyCout {};
extern MyCout myCout;
template <typename T>
MyCout& operator<< (MyCout &s, const T &x) {
//format x as you please
std::cout << x;
return s;
}
并放入MyCout myCout;
任何一个 .cpp 文件中。
然后你可以myCout
像这样使用:
myCout << "test" << x << std::endl;
operator<<
它会调用可以进行格式化的模板。
当然,如果您愿意,您还可以为特定类型的特殊格式提供运算符的重载。
编辑
显然(感谢@soon),为了使标准操纵器工作,需要更多的重载:
MyCout& operator<< (MyCout &s, std::ostream& (*f)(std::ostream &)) {
f(std::cout);
return s;
}
MyCout& operator<< (MyCout &s, std::ostream& (*f)(std::ios &)) {
f(std::cout);
return s;
}
MyCout& operator<< (MyCout &s, std::ostream& (*f)(std::ios_base &)) {
f(std::cout);
return s;
}
编辑 2
我可能稍微误解了您的原始要求。这个怎么样(加上与上面相同的操纵器重载):
struct MyCout
{
std::stringstream s;
template <typename T>
MyCout& operator << (const T &x) {
s << x;
return *this;
}
~MyCout() {
somehow_format(s);
std::cout << s.str();
}
};
int main() {
double y = 1.5;
MyCout() << "test" << y;
}