0
namespace settings{
  typedef wchar_t char_t;
  typedef std::basic_string<char_t> string_t;
}

namespace util{
  namespace string{
    std::basic_string<wchar_t>  toWide(const std::basic_string<char>&      s);
    std::basic_string<char>     fromWide(const std::basic_string<wchar_t>& w);
  }
}

これは私が持っているものです。またはのchar_t場合があります。ここで、入力文字列をインテリジェントに変換する 2 つの関数が必要ですwchar_tcharsettings::string_t

settings::string_t  from(const std::basic_string<char>& s);
settings::string_t  from(const std::basic_string<wchar_t>& s);

string_t が wstring として typedef されているが string を返すため、使用boost::is_sameは機能しませんreturn s

settings::string_t util::string::from(const std::basic_string< char >& s){
  if(boost::is_same< std::basic_string<char> , settings::string_t >::value){
    return s;
  }else{
    return toWide(s);
  }
}

InputTypeテンプレートとオーバーロードを使用してとが同じかどうかを識別するのstring_tは簡単ですが、同じでない場合は 4 つのバリエーションがあります。

型 operator をオーバーロードせずにこのシナリオをモデル化する方法は?

概要

と文字列のsettings::string_t from(const std::basic_string<T>& s);両方を に変換する を設計するにはどうすればよいですか。ここで、T はまたはにもなり得ます。質問でわかるように、柔軟性があります。両方または文字列にすることもできますcharwcharstring_tcharwchar_tstring_tcharwchar_t

4

1 に答える 1

1

各方向を変換する機能が異なるため、すべてのオーバーロードを削除することはできません。構造体のテンプレート特殊化を使用しましたが、オーバーロードでも同様に実行できるはずです。

ヘルパー クラス (およびその特殊化) は名前空間に簡単に配置して移動できるため、ユーザーには表示されません (たとえば、detailboost の下の名前空間を参照してください)。また、必要な特殊化を提供せずに組み合わせを使用すると、コンパイルに失敗します。

template<typename FromCharT, typename ToCharT>
struct helper;

// If T is the same on both sides, just copy
template<typename T>
struct helper<T, T>
{
   static std::basic_string<T> convert(const std::basic_string<T>& s)
   {
      return s;
   } 
};

// char -> wchar_t
template<>
struct helper<char, wchar_t>
{
   static std::basic_string<wchar_t> convert(const std::basic_string<char>& s)
   {
      return toWide(s);
   } 
};

// wchar_t -> char
template<>
struct helper<wchar_t, char>
{
   static std::basic_string<char> convert(const std::basic_string<wchar_t>& s)
   {
      return fromWide(s);
   } 
};


template<typename T>
settings::string_t from( const std::basic_string<T>& f)
{
   return helper<T, settings::char_t>::convert(f);
}
于 2012-08-02T17:27:52.530 に答える