C++ 11 中具有多个模板参数的模板函数的特化
Specialization of a template function with multiple template parameters in C++ 11
无法弄清楚为什么我会收到以下代码的编译器错误:
#include <tchar.h>
typedef TCHAR Char;
typedef std::basic_string<Char> String;
template<typename C, typename T>
std::basic_string<C> InternalToString(T val);
template<typename T>
inline std::string InternalToString<char, T>(T val)
{
return std::to_string(val);
}
template<typename T>
inline std::wstring InternalToString<wchar_t, T>(T val)
{
return std::to_wstring(val);
}
template<typename T>
inline String ToString(T val)
{
return InternalToString<Char, T>(val);
}
如果我使用 MSVC 2017 编译代码,我会得到 "error C2768: 'InternalToString': illegal use of explicit template arguments"
Partial specialization 不允许用于函数模板,它只能用于 class 模板。
您可以使用 SFINAE 应用函数模板重载。例如
// used when C is specified as char
template<typename C, typename T>
inline typename std::enable_if<std::is_same<C, char>::value, std::string>::type InternalToString(T val)
{
return std::to_string(val);
}
// used when C is specified as wchar_t
template<typename C, typename T>
inline typename std::enable_if<std::is_same<C, wchar_t>::value, std::wstring>::type InternalToString(T val)
{
return std::to_wstring(val);
}
// used when C is specified as other types
template<typename C, typename T>
typename std::enable_if<!std::is_same<C, char>::value && !std::is_same<C, wchar_t>::value, std::basic_string<C>>::type InternalToString(T val);
无法弄清楚为什么我会收到以下代码的编译器错误:
#include <tchar.h>
typedef TCHAR Char;
typedef std::basic_string<Char> String;
template<typename C, typename T>
std::basic_string<C> InternalToString(T val);
template<typename T>
inline std::string InternalToString<char, T>(T val)
{
return std::to_string(val);
}
template<typename T>
inline std::wstring InternalToString<wchar_t, T>(T val)
{
return std::to_wstring(val);
}
template<typename T>
inline String ToString(T val)
{
return InternalToString<Char, T>(val);
}
如果我使用 MSVC 2017 编译代码,我会得到 "error C2768: 'InternalToString': illegal use of explicit template arguments"
Partial specialization 不允许用于函数模板,它只能用于 class 模板。
您可以使用 SFINAE 应用函数模板重载。例如
// used when C is specified as char
template<typename C, typename T>
inline typename std::enable_if<std::is_same<C, char>::value, std::string>::type InternalToString(T val)
{
return std::to_string(val);
}
// used when C is specified as wchar_t
template<typename C, typename T>
inline typename std::enable_if<std::is_same<C, wchar_t>::value, std::wstring>::type InternalToString(T val)
{
return std::to_wstring(val);
}
// used when C is specified as other types
template<typename C, typename T>
typename std::enable_if<!std::is_same<C, char>::value && !std::is_same<C, wchar_t>::value, std::basic_string<C>>::type InternalToString(T val);