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文字しか載っていない!
#ちなみに足りないのは「!」