我有 JsonFormatter
模板类,专门用于算术等不同类型......通过以下方式:
template <class T, typename Enable = void>
class JsonFormatter;
template <class T>
class JsonFormatter<T, typename std::enable_if<std::is_arithmetic<T>::value>::type>
{
};
目前还不清楚如何将它特化为具体类型,例如 std::string
?我的第一个想法是这样的:
template <>
class JsonFormatter<std::string, std::true_type>
{
};
但这不编译。当我使用
JsonFormatter<std::string>
我明白了
"undefined class 'JsonFormatter<std::string,void>'"
最佳答案
重要的一点是特化必须与小学相匹配。在这种情况下,主要的设置使得第二个模板参数将成为 void
- 它不打算由用户提供,只是为了让人们能够使用 enable_if
.
std::true_type
不匹配 void
,这就是它不起作用的原因。当用户写 JsonFormatter<std::string>
, 默认参数将被实例化为 void
- 所以他们正在寻找特化 JsonFormatter<std::string, void>
...这不是您提供的。
你想要:
template <>
class JsonFormatter<std::string, void>
{ };
甚至只是:
template <>
class JsonFormatter<std::string>
{ };
因为默认参数会被很好地填充。
关于c++ - 具有 std::enable_if 和具体类型的模板类特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55580508/