c++ - 具有 std::enable_if 和具体类型的模板类特化

标签 c++ templates c++17 sfinae

我有 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/

相关文章:

c++ - 填充结构类型模板化的结构成员

c++ - 使用 std::conditional 根据模板参数选择成员类型

c++ - Opencv 2.3 cvtColor 函数

c++ - 有人用过 Facebook Scribe 吗? (记录一切的工具)

循环迭代两个项目的 Django 模板

c++17 - 如何检查模板中的结构是否具有 BOOST_HANA_ADAPT_STRUCT?

c++ - 带有包含变体的 vector 的 Remove_if

c++ - 同一个线程中的 std::unique_lock 和 std::shared_lock - 不应该工作,但是可以吗?

C++ 反向迭代器和 Eigen

c++ - 如何使用有限的 fork 数量运行类似 shell 的管道任务?