C++20四大之三:concept特性详解

本文详细介绍了C++20中的Concept特性,它提供了一种更清晰、更精确的方式来约束模板参数,提高了代码可读性和编译错误提示的准确性。通过概念,可以避免模板实例化时的错误,简化std::enable_if等类型检查的复杂性,并且内置了多种常用概念,同时也支持自定义概念。Concept的使用包括require-clause、内置概念以及自定义概念的定义,为C++模板编程带来了重大改进。
摘要由CSDN通过智能技术生成

前言:C++模板的演进
模板的演进是C++发展史中一条十分重要的线,个人觉得Concept是这条线中最大的一个特性了。在介绍Concept之前,我们先捋一捋模板这条线的发展。
在这里插入图片描述

据Stroustrup先生回忆, 对模板的设想早在1982年便有了,正式提出是在1998年的 USENIX C++ conference会议上提出,设计模板的初衷是因为当时的C++缺少一个标准库,而当时没有模板的C++很难设计出“vector、list”这种适用于多种类型的容器。
到1998年模板正式进入标准,在这之前C++模板已经是一个图灵完备的语言了——理论上来讲,可以只用模板代码解决任何可计算的问题。用递归实现循环、模板特化、偏特化实现分支判断。例如下面这个模板可以在编译期计算的fibonacci函数:

template<int  N>
int fibonacci() {
   
  return fibonacci<N-1>() + fibonacci<N-2>(); 
}
template<>
int fibonacci<1>() {
    return 1; }
template<>
int fibonacci<0>() {
    return 0; }

SFINAE特性为上述代码的运作提供了保障。两个模板的特化构造了递归的退出条件,“隐式”的实现了if判断的功能。到了C++17,有了if constexpr,上面这段代码可以写的更加“直白”

template<int N>
constexpr int fibonacci(){
   
  if constexpr(N <= 1)
    return N;
  else
    return fibonacci<N-1>() + fibonacci<N-2>();
  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值