【发布时间】:2020-09-16 09:23:44
【问题描述】:
我对 SFINAE 有基本的了解,并且我想我了解很多关于 std::enable_if 如何利用它来选择函数模板专业化的示例,但我很难理解它在课堂上的工作原理模板。
以下示例来自cppreference.com's explanation of std::enable_if:
template<class T, class Enable = void>
class A {}; // primary template
template<class T>
class A<T, typename std::enable_if<std::is_floating_point<T>::value>::type> {
}; // specialization for floating point types
我无法理解以这种方式使用std::enable_if 如何帮助选择专业。 (我不怀疑它确实如此。)
当编译器看到像A<float> specialized; 这样的声明时,它会看到两个可能的模板实例化:
- “主模板”
A<T, Enable>其中T是float类型,Enable 是void类型(因为默认值)。 - 特化
A<T, void>,其中T是float类型,void是enable_if表达式的结果。
那些不是模棱两可的吗?两者都有效地导致A<T, void>,那么为什么选择专业化?
在另一种情况下,例如A<int> primary;,编译器的选项似乎是:
- 主要
A<T, Enable>,其中T是int类型,Enable是void类型。 - 专业化
A<T, ?>,其中T是int类型,?代表我完全迷失的地方。在这种情况下,enable_if条件为假,因此它没有定义type,这会留下A<int, typename >。这不是语法错误吗?即使面对 SFINAE?
【问题讨论】:
标签: c++ template-meta-programming template-specialization enable-if class-template