These search terms have been highlighted:[trick]
2008-10-01
iomanip の setw(5) みたいなノリで,出力する文字に色をつける方法を考える.
cout<<ioscc::green<<"GREEN"<<endl;
のようにすれば,緑色で GREEN が表示されるようにしたい. std::endl で色がリセットされる. で,書いてみたのが以下のコード.
#include <iostream>
namespace ioscc
{
enum TColorCode {red=1, blue, green};
const char *_sesc = "\033[";
const char *_sreset = "0m";
const char *_sred = "31;1m";
const char *_sblue = "34;1m";
const char *_sgreen = "32;1m";
};
struct _colored_stream
{
std::ostream &os;
};
inline _colored_stream operator<< (std::ostream &os, ioscc::TColorCode ccode)
{
switch (ccode)
{
case ioscc::red : os<<ioscc::_sesc<<ioscc::_sred; break;
case ioscc::blue : os<<ioscc::_sesc<<ioscc::_sblue; break;
case ioscc::green : os<<ioscc::_sesc<<ioscc::_sgreen; break;
}
_colored_stream colos={os};
return colos;
}
template <typename T>
_colored_stream operator<< (_colored_stream os, const T &rhs)
{
os.os << rhs;
return os;
};
template <>
_colored_stream operator<< (_colored_stream os, const ioscc::TColorCode &ccode)
{
os.os << ioscc::_sesc<<ioscc::_sreset;
os.os << ccode;
return os;
};
_colored_stream operator<< (_colored_stream os, std::ostream& (*__pf)(std::ostream&))
{
os.os << ioscc::_sesc<<ioscc::_sreset;
__pf(os.os);
return os;
};
こんな感じで使う (iomanip を include しておく必要がある):
cout<<ioscc::red<<setw(10)<<"赤"<<ioscc::blue<<setw(10)<<"青"<<endl;
cout<<ioscc::green<<"GREEN"<<ioscc::blue<<" BLUE"<<flush;
cout<<" DEFAULT"<<endl;
cout<<ioscc::green<<setprecision(20)<<3.14159265358979323846l<<endl;
すると,
赤 青
GREEN BLUE DEFAULT
3.1415926535897932385
こんなふうに表示される.