具有 std::enable_if 和具体类型的模板 class 专业化
Template class specialization with std::enable_if and a concrete type
我有 JsonFormatter
模板 class 专门用于算术等不同类型...如下所示:
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>'"
这就是您专门化模板的方式:
template <>
class JsonFormatter<std::string, void>
{
};
您也可以使用 std::enable_if
,但我不推荐它,因为简单的专业化要容易得多。 std::enable_if
仅适用于 SFINAE。所以它需要依赖一个模板参数:
template <class T>
class JsonFormatter<T, std::enable_if_t<std::is_same_v<T, std::string>>>
{
};
重要的一点是专业化必须与小学相匹配。在这种情况下,主要的设置使得第二个模板参数将成为 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>
{ };
因为默认参数会被很好地填充。
it is not clear how to specialize it for a concrete type like std::string
, for example?
你有没有简单地尝试过
template <>
class JsonFormatter<std::string>
{
};
?
应该有效。
第二个模板参数根据主版本中定义的默认值变为void
。
我有 JsonFormatter
模板 class 专门用于算术等不同类型...如下所示:
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>'"
这就是您专门化模板的方式:
template <>
class JsonFormatter<std::string, void>
{
};
您也可以使用 std::enable_if
,但我不推荐它,因为简单的专业化要容易得多。 std::enable_if
仅适用于 SFINAE。所以它需要依赖一个模板参数:
template <class T>
class JsonFormatter<T, std::enable_if_t<std::is_same_v<T, std::string>>>
{
};
重要的一点是专业化必须与小学相匹配。在这种情况下,主要的设置使得第二个模板参数将成为 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>
{ };
因为默认参数会被很好地填充。
it is not clear how to specialize it for a concrete type like
std::string
, for example?
你有没有简单地尝试过
template <>
class JsonFormatter<std::string>
{
};
?
应该有效。
第二个模板参数根据主版本中定义的默认值变为void
。