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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.