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