c++ - C++ 11 中具有多个模板参数的模板函数的特化

标签 c++ templates template-specialization

无法弄清楚为什么我会收到以下代码的编译器错误:

#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 编译代码,我会收到“错误 C2768:'InternalToString':非法使用显式模板参数”

最佳答案

Partial specialization不允许用于函数模板,它只能用于类模板。

您可以使用 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);

关于c++ - C++ 11 中具有多个模板参数的模板函数的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51839900/

相关文章:

c++ - 如何在XAudio2上同时播放多种声音?

c++ - 从 map 中删除一个元素然后放回去

c++ - 在 C++11 别名模板上调用构造函数和运算符

templates - Odoo - 在日历 View 中使用模板?

c++ - 完全特化类模板的函数模板的显式特化

c++ - 具有虚拟成员 : linker error 的模板类

c++ - 为什么 g++ 不链接我创建的动态库?

c++ - 使用 gdb 调试在问号函数 "?? ()"中显示段错误

C++ 使用指向模板对象的指针

c++ - 如何专门化模板类中的赋值运算符?