使用std :: enable_if和具体类型的模板类专门化

问题描述 投票:2回答:3

我有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>'"
c++ templates c++17 sfinae
3个回答
4
投票

重要的是专业化必须与初级相匹配。在这种情况下,主要设置为第二个模板参数将是void - 它不是由用户提供的,它只是让人们使用enable_if

std::true_typevoid不匹配,这就是为什么它不起作用。当用户写JsonFormatter<std::string>时,默认参数将被实例化为void - 所以他们正在寻找专业化JsonFormatter<std::string, void> ...这不是你提供的。

你要:

template <>
class JsonFormatter<std::string, void>
{ };

甚至只是:

template <>
class JsonFormatter<std::string>
{ };

由于默认参数将被填写就好了。


1
投票

这是您对模板进行专门化的方式:

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>>>
{
};

1
投票

例如,目前尚不清楚如何将它专门用于像std::string这样的具体类型?

你有没有尝试过

template <>
class JsonFormatter<std::string>
{
};

?

应该有效。

第二个模板参数根据主版本中定义的默认值变为qazxsw poi。

© www.soinside.com 2019 - 2024. All rights reserved.