簡體   English   中英

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種不同的方式重載。 但有更好的方法嗎?

代碼來自: 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分配每個流的單詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM