C++以多种方式打印对象

C++ Printing an object in multiple ways

本文关键字:式打印 对象 C++      更新时间:2023-10-16

如果我采用一个简单的日期对象:

#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来分配每个流字。