我想用'0'作为填充字符在2个字段上打印一堆整数。我可以做到,但这会导致代码重复。我应该如何更改代码,以便可以排除重复的代码?

#include <ctime>
#include <sstream>
#include <iomanip>
#include <iostream>

using namespace std;

string timestamp() {

    time_t now = time(0);

    tm t = *localtime(&now);

    ostringstream ss;

    t.tm_mday = 9; // cheat a little to test it
    t.tm_hour = 8;

    ss << (t.tm_year+1900)
       << setw(2) << setfill('0') << (t.tm_mon+1) // Code duplication
       << setw(2) << setfill('0') <<  t.tm_mday
       << setw(2) << setfill('0') <<  t.tm_hour
       << setw(2) << setfill('0') <<  t.tm_min
       << setw(2) << setfill('0') <<  t.tm_sec;

    return ss.str();
}

int main() {

    cout << timestamp() << endl;

    return 0;
}

我努力了

std::ostream& operator<<(std::ostream& s, int i) {

    return s << std::setw(2) << std::setfill('0') << i;
}

但它不起作用,operator<<调用不明确。

编辑我得到了4个很棒的答案,我选择了一个也许是最简单,最通用的答案(也就是说,不假定我们正在处理时间戳)。对于实际问题,我可能会使用 std::put_time strftime

最佳答案

您需要像这样的字符串流代理:

struct stream{
    std::ostringstream ss;
    stream& operator<<(int i){
        ss << std::setw(2) << std::setfill('0') << i;
        return *this; // See Note below
    }
} ss;

那么您的格式代码就是这样:
ss << (t.tm_year+1900)
   << (t.tm_mon+1)
   << t.tm_mday
   << t.tm_hour
   << t.tm_min
   << t.tm_sec;

return ss.ss.str();

ps。请注意我的stream::operator <
09-06 13:52