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は役に立つ。本当に変更すべき部分だけ書き換えればいいのだから。
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment