Boost.Iostreamsでストリーム作成!

Boost.Iostreamsでできることのひとつとして、ストリームの作成が簡単にできる、というのがあります。

それには、まず入出力するデータをやりとりするクラスを作ります。
(このクラスをDeviceといいます。また、出力DeviceはSink、入力DeviceはSourceと呼ばれています)
そして、それをストリーム型に渡せばOKです。

ここでは文字列に☆をつけて女子力を上げるストリームを作成します。

#include <iostream>
#include <boost/iostreams/stream.hpp>
#include <boost/algorithm/string/replace.hpp>

//Sinkクラスを作成するためには、
//boost::iostreams::sinkを継承し、メンバ関数writeを定義します
class GirlSink : public boost::iostreams::sink{
private:
    std::ostream* out_;

public:
    GirlSink(std::ostream* out) : out_(out){}
    
    std::streamsize write(const char* s, std::streamsize n){
        //行の末尾に'☆'をつける
        std::string str(s, n);
        boost::algorithm::replace_all(str, "\n", "☆\n");
        if(*(std::end(str) - 1) != '\n'){ str.append("☆"); }

        *out_ << str;

        return n;
    }
};

int main(){
    namespace io = boost::iostreams;

    GirlSink girl(&std::cout);
    io::stream<GirlSink> out(girl);
    out << "こんにちはみなもです" << std::endl;
    out << "よろしくね" << std::endl;

	return 0;
}

Output:

こんにちはみなもです☆
よろしくね☆


…あがりましたか?

2012/06/23追記
IostreamsにはDeviceのほかFilterというものがあります。
ここではDeviceでデータの加工と出力を行いましたが、役割を考えると、
DeviceはI/Oする対象(たとえばファイル)とデータを入出力する、Filterでデータの処理をする、と分けたほうがいい気がします。