C++20前模板需要给类型添加限制时,比如需要给一个函数模板的参数类型限制为整形,可以使用c++11中的std::enable_if
和std::is_integral
:
1 | template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>> |
即通过额外的类型匹配来完成类型约束,你可以在stl源码中找到大量的enable_if
约束。
但这种做法有几个问题:
- 复用麻烦,当多个模板需要相同的类型约束时,只能将相同代码复制多份
- 约束失败时错误不明了,如上模板传入浮点类型时,编译器只会抱怨
enable_if<false, void>
内没有type
类型,如果约束条件更复杂,得到的编译错误将更难以阅读
综上原因,20标准往前走了一步,将类型约束(Constraint)进行了规范,并提出了新的“概念”(Concept)。