自分でstd::codecvtを拡張する

上で用いているutf8_codecvt_facet_wchar_tはstd::codecvtの一実装に過ぎません.ユーザはstd::codecvtからクラスを派生させて独自のコード変換ファセットを定義することが可能です.もちろん,そうして作成したファセットを上とまったく同様にストリームに組み込んで,ユーザが望むコード変換を内部に備えたストリームを作成可能です.
上で使っているutf8_codecvt_facet_wchar_tの実装を見ればおおよそ拡張の仕方が分かると思いますが,とりあえず簡単にだけ説明しておきます.
std::codecvtのpublicメンバであるinやoutなどは全て非仮想関数として定義されています.が,これらのメンバ関数は実装をそのまんま対応するprotectedな仮想関数であるdo_inやdo_outへ委譲しています.従って,std::codecvtからクラスを派生させて,そのクラスにprotectedなdo_inやdo_outといったメソッドを実装すれば,望むコード変換ファセットが実装可能です.これでoperator<<やoperator>>の呼び出しの際に任意のコード変換を行ってくれるストリームが作れます.
おしまい.
#自分で変換コード書くのは面倒だから,iconvあたりに丸投げするcodecvt作ればそれだけで・・・うひょひょ.<でも(GNUの)iconvは好きじゃない人