C++以多种方式打印对象
C++ Printing an object in multiple ways
如果我采用一个简单的日期对象:
#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个(或更多)打印选项之间进行选择的最佳方式是什么?
我想的是类似于从date类的两个方法返回两个独立的类,每个方法都有它们的运算符<lt;以两种不同方式过载。但是有更好的方法吗?
代码来源:http://msdn.microsoft.com/en-us/library/1z2f6c2k.aspx
依赖于区域性的流格式(如日期、货币)应基于给定流的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;
DEMO
您需要实现一个操纵器。
我相信C++支持实现您自己的。为了获得灵感,可以看看std::showbase
/std::noshowbase
是如何在您的环境中实现的。您需要实现ukdate/noukdate。
编辑:showbase
确实太窄了——我们需要使用std::ios_base::xalloc
来分配每个流字。
相关文章:
- 将对象放入地图后打印对象
- 打印对象的映射,其中另一个对象作为键
- 如何在C++中打印对象向量的内容
- C++ - 使用 std::list,如何打印对象的私有成员的链接列表?
- 使用成员函数打印对象
- 如何在C++中转换可打印对象中的对象
- 打印对象矢量的意外输出
- 如何使用 is_invocable() 创建用于重载<<打印对象的模板?
- 悬挂式C 打印形状来自字符串阵列
- 运算符重载<<,打印对象矢量时遇到问题
- 显式调用 c++ 对象的析构函数
- 我正在尝试循环浏览对象的向量并打印对象的每个元素
- 在更改对象值后,打印对象数组仍会给出相同的值
- 声明并使用静态列表来打印对象(在c++中)
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 如何在 c++ 中的字符串中显式打印“”
- 为什么写入临时字符串流对象只打印对象地址
- 打印对象数组
- 有没有一种方法可以打印对象的位表示
- OpenCV - 仅在绘制单应性时打印对象名称