← 模式

类模板 SFINAE

123456789101112#include <type_traits> template <typename T, typename Enable = void> class foo; template <typename T> class foo<T, typename std::enable_if<std::is_integral<T>::value>::type> { }; template <typename T> class foo<T, typename std::enable_if<std::is_floating_point<T>::value>::type> { };

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

根据模板参数,有条件地实例化类模板。

描述

我们为 foo 类模板提供了两个偏特化版本。

  1. 位于第 6-8 行的模板仅在 T 是整数类型时才会被实例化。
  2. 位于第 10-12 行的模板仅在 T 是浮点类型时才会被实例化。

这使我们能够根据 foo 类实例化时所用的模板参数,为其提供不同的实现。

我们在第 7 行第 11 行使用了 std::enable_if,以强制实例化仅对适当的模板参数生效。这依赖于“替换失败不是错误”(SFINAE)原则,该原则指出,使用某些特定模板参数实例化模板失败不会导致错误,而只会简单地丢弃该实例化。

如果你只是想阻止模板针对某些模板参数进行实例化,请考虑改用 static_assert

贡献者

  • Joseph Mansfield
  • Alejandro Mallea

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享