C++模板:尖括号中的typename和||s



我正在这里浏览这段代码,TensorRT引擎序列化和反序列化源代码。我偶然发现了一些以前从未见过的语法。

struct Serializer<T, // ??
typename std::enable_if<std::is_arithmetic<T>::value || std::is_enum<T>::value || std::is_pod<T>::value>::type>
{ // ...

注释问号后面的代码在做什么?毫无疑问,这个语法对我来说完全陌生。我非常感谢能阅读到的任何资源,以了解更多关于它到底在做什么。

在提问之前,我通常会列出我执行过的谷歌查询列表,但我甚至不知道该怎么称呼这种模式。

源代码:https://github.com/NVIDIA/TensorRT/blob/492878b2df3c9bf19a26c2b66cba129f450475bc/plugin/common/serialize.hpp#L45

语法的计算结果为void(以匹配可假定的默认模板参数(或未能执行此操作。您可能需要重新查看C++模板。SFINAE是一种通过失败来约束模板专业化的技术。由于C++20概念提供了更好的机制。