要在fjardon's answer扩大,您可以创建任何类型的默认格式,您希望使用的模板,这样
cout << formatted(2.0) << ' ' << formatted(1.4,6) << ' ' << formatted(2.3f)
使用不同的精度等。这可以通过
namespace io_formatting {
template<typename Tp>
struct manipulator
{
Tp val;
int prec;
manipulator(Tp x, int p=std::numeric_limits<Tp>::digits10)
: val(x), prec(p) {}
};
template<typename X>
inline std::ostream& operator<<(std::ostream&o, manipulator<X> const&m)
{
return o << std::scientific
<< std::showpos
<< std::setprecision(m.prec)
<< m.val;
}
}
template<typename Tp>
io_formatting::manipulator<Tp> formatted(Tp x) { return {x}; }
template<typename Tp>
io_formatting::manipulator<Tp> formatted(Tp x, int p) { return {x,p}; }
实施
您可以使用专业化和/或SFINAE来区分不同类型(浮点,积分,复杂...)。
您可以定义一个应用所需选项的操纵器。显式是好的,隐含的是不好的。大致。 –
即使可能,您也不应该(想要)那样做。这会让你的代码更难理解和维护。 – Walter
@ Cheersandhth.-Alf你能更明确吗? – JorenHeit