如果我采用一个简单的日期对象:
#include <iostream>
using namespace std;
class Date
{
int mo, da, yr;
public:
Date(int m, int d, int y)
{
mo = m; da = d; yr = y;
}
friend ostream& operator<<(ostream& os, const Date& dt);
};
ostream& operator<<(ostream& os, const Date& dt)
{
os << dt.mo << '/' << dt.da << '/' << dt.yr;
return os;
}
int main()
{
Date dt(5, 6, 92);
cout << dt;
}
我希望可以选择以英国人理解的方式打印它,即
ostream& operator<<(ostream& os, const Date& dt)
{
os << dt.da << '/' << dt.mo << '/' << dt.yr;
return os;
}
如何让班级用户在2个(或更多)打印选项之间进行选择?
我在考虑类似于从日期类的两个方法返回两个单独的类,每个类都有它们的运算符&lt;&lt;以两种不同的方式超载。但有更好的方法吗?
答案 0 :(得分:9)
依赖于文化的流格式(例如日期,货币格式)应基于给定流的std::locale
设置:
#include <locale>
#include <ostream>
std::ostream& operator<<(std::ostream& os, const Date& dt)
{
std::time_base::dateorder d = std::use_facet<std::time_get<char>>(os.getloc())
.date_order();
if (d == std::time_base::dmy)
{
// Selected format is day / month / year
os << dt.da << '/' << dt.mo << '/' << dt.yr;
}
else if (d == std::time_base::mdy)
{
// Selected format is month / day / year
os << dt.mo << '/' << dt.da << '/' << dt.yr;
}
else
{
// Default format is year . month . day
os << dt.yr << '.' << dt.mo << '.' << dt.da;
}
return os;
}
这允许您的类的用户在不同格式之间进行选择(假设支持语言环境),以便针对给定的文化调整输出:
Date d{ 9, 8, 2014 };
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << d << std::endl;
std::cout.imbue(std::locale("de_DE.utf8"));
std::cout << d << std::endl;
答案 1 :(得分:4)
您需要实施manipulator。
我确信在C ++中有支持实现自己的支持。如需灵感,请查看在您的环境中如何实施std::showbase
/ std::noshowbase
。你需要实现ukdate / noukdate。
修改:showbase
确实是一个非常狭隘的例子 - 我们需要使用std::ios_base::xalloc
分配每个流的单词。