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;
}

现在我必须为每个宽字符串类型编写相同的函数,但是是否可以专门化一次并涵盖所有宽字符串类型?

提前谢谢!

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 回答