boost/format.hpp

iostream って使いにくい。特に浮動小数点数を使う時は printf系に分がある気がする。

たとえば以下のCのコードも

#include <stdio.h>
int
main()
{
     printf("%10d\n", 12345);
     printf("%10.3f\n", 12.345);
     printf("%10.6f\n", 12.345);
     return 0;
}

std::cout を使うだけで、こんなにややこしくなる。

#include <iostream>
#include <iomapi>
using namespace std;

int
main() {
     cout << setw(10) << 12345 << endl;
     cout << setw(10) << setprecision(3) << fixed << 12.345 << endl;
     cout << setw(10) << setprecision(6) << fixed << 12.345 << endl;
     return 0;
}

打開策として、boost/format.hpp をつかえば

#include <boost/format.hpp>
#include <iostream>

using namespace std;
using namespace boost;

int main()
{
     cout << boost::format("%d") % 12345 << endl;
     cout << boost::format("%f") % 12.345 << endl;
     cout << boost::format("%7.3f") % 12.345 << endl;
     
     return 0;
}

となる。こういうコードを見る度に、http://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html を思い出す。

なんかイライラするので、printf.hpp というものを作って

#include "printf.hpp"

int
main()
{
     printf(cout, "%10.3f\n", 1.2);
     printf(cout, "%d %d\n", 10, 20);

     return 0;
}

と出来るようにしてみた。

ちなみに printf.hpp の中身はこんな感じ。

#include <iostream>
#include <boost/format.hpp>

template <typename T1>
std::ostream& printf(std::ostream& os,
		     const char *format,
		     const T1& arg1)
{
     os << boost::format(format) % arg1;
     return os;
}

template <typename T1, typename T2>
std::ostream& printf(std::ostream& os,
		     const char *format,
		     const T1& arg1,
		     const T2& arg2)
{
     os << boost::format(format) % arg1 % arg2;
     return os;
}

c++ は不毛な言語だ。


(2019年2月8日追記)
c++11でまともな解決策に辿り着きました.
pyopyopyo.hatenablog.com