1

現在、C++ テンプレートの知識を向上させたいと考えていますが、問題に遭遇しました。std::wstring、wchar_t、wchar_t* などのすべてのワイド文字タイプを受け入れるテンプレート関数を作成することは可能ですか? ここに私が何を意味するかを示す例があります:

template <typename T> Function(T1 var)
{
    // Do something with std::stringstream and the passed var;
}

上記の関数の問題は、たとえば wchar_t や std::wstring では機能しないことです。代わりに std::wstringstream を使用する必要があります。次のように専門化できます。

template <> Function(wchar_t var)
{
    // Do something with std::wstringstream and the passed var;
}

ワイド文字列型ごとに同じ関数を作成する必要がありますが、一度特殊化してすべてのワイド文字列型をカバーすることは可能ですか?

事前にt​​hx!

4

1 に答える 1

3

特性テクニックを使用します。is_wide_char_typeいくつかのクラス テンプレートを定義します。このような:

template <T>
struct is_wide_char_type { static const bool VALUE = false; };
template <>
struct is_wide_char_type<wchar_t> { static const bool VALUE = TRUE; };
... for others types the same.

関数テンプレートは部分的に特殊化できないため、クラス テンプレートを定義する必要があります。

template <typename T, boo isWideChar> class FunctionImpl;
template <typename T> struct FunctionImpl<T, false> {
  static void doIt() {
     // code for not wide char types
  }
};
template <typename T> struct FunctionImpl<T, true> {
  static void doIt() {
     // code for wide char types
  }
};


template <typename T> Function(T1 var)
{
   FunctionImpl<T, is_wide_char_type<T>::VALUE>::doIt();
}

または、それをさらに簡単にしてis_wide_char_type<T>、種類のタグ情報だけでなく、T使用する文字列ストリームや好きなものについても特性に含めることを検討してください。

于 2012-09-19T21:17:43.357 に答える