我想提高我对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;
}
现在我必须为每个宽字符串类型编写相同的函数,但是可以专门化一次并覆盖所有宽字符串类型吗?
提前谢谢!答案 0 :(得分: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
种类的唯一标记信息,还包括要使用的字符串流以及您喜欢的任何内容。