2007-10-07

Boost.Program_optionsの問題解決

 どうせソースコードも公開されていて、しかもライセンスも制限なしといっていいほどゆるいのだから、書き換えてみることにした。面倒かもしれないと予想していたが、以外にも簡単だった。   やりたい事 wvalue(std::wstring)->default_value(L"Unicode") が出来ること。 問題点 現行のprogram_optionsの実装はdefault_valueの引数の型の値を、lexical_castでstd::stringにキャストしようとすること。 当然std::wstringからのキャストはできない。 改変方法 utf16のstd::wstringから、utf8のstd::stringへ変換してやればいい。 改変の次第 boost/program_options/value_semantic.hppに #include <boost/program_options/detail/convert.hpp> を付け加えて、 typed_valueのプライマリテンプレートの下に、次のメンバ特殊化を付け加えればいい。 template<>   typed_value<std::wstring, wchar_t> *     typed_value<std::wstring, wchar_t>::default_value(std::wstring const v) {   m_default_value = boost::any(v);   m_default_value_as_text = boost::to_utf8(v);   return this; }  いやはや、C++のテンプレートはすばらしい。とくにMember Specializationは役に立つ。本当に変更すべき部分だけ書き換えればいいのだから。

No comments: