static_widen
wpath対応作業でテンプレート中から文字型に応じた文字リテラルが必要になることが多く、static_widenというメタ関数っぽい構造体を作りました。
<hamigaki/static_widen.hpp>
こんな感じで使えます。
#include <hamigaki/static_widen.hpp> #include <string> template<class CharT> bool has_root(const std::basic_string<CharT>& s) { // valueはCharTがcharなら'/'、wchar_tならL'/' // それ以外ならコンパイルエラー return s[0] == hamigaki::static_widen<CharT,'/'>::value; }
実装は基本実行文字集合に対する総当りなやり方です。
namespace hamigaki { template<class CharT, char c> struct static_widen; // ナロー文字用 template<char c>struct static_widen<char,c>{static const char value=c;}; // ワイド文字用 template<>struct static_widen<wchar_t,'a'>{static const wchar_t value=L'a';}; template<>struct static_widen<wchar_t,'b'>{static const wchar_t value=L'b';}; template<>struct static_widen<wchar_t,'c'>{static const wchar_t value=L'c';}; // 以下略 } // namspace hamigaki
#基本ソース文字集合は96文字なのに、JIS規格には95文字しか載っていない!
#ちなみに足りないのは「!」