c++26新功能—契约与概念

一、契约与概念

随着C++新标准的演进中,对安全控制越来越严格,就会出现在不同层次上的安全控制约束。这也符合安全问题解决的思路即全链路控制、整体推进而不能出现所谓的木桶原理现象。本文就对C++26中的契(合)约(Contracts)与C++20中的概念(Concepts)进行初步的分析和说明。

二、契约和概念的特点与不同

在前文分析过,契约更倾向于在运行时进行pre、post等进行条件限制而概念更多的是应用在模板编程中,主要目的是为了约束具体的模板编译条件。所以说二者的一个最重要的不同的在于契约重点是在运行时进行安全控制而概念重点在模板的编译时进行安全控制。
正如在相关文档中所描述,概念与契约是互不相见(Concepts Do Not See Contracts)。也即契约的安全控制无法影响概念的安全控制,这也符合设计思想的理论。
另外,契约一般是限制函数而概念主要是对模板参数进行控制。在出现异常状态时,契约既可以执行默认的行为也可以自定义行为;而概念则提供一个编译错误。
通过上而把 分析可以看出,契约和概念不是互斥的,它们是在不同的层面上对C++代码进行安全控制的,它们可以单独工作也可以一起合作进行协同,提高代码的安全可靠性。

三、二者的协同应用

基于上面的分析,在程序的设计和开发中,可以通过分层进行整体的安全控制:
1、在编译时使用Concepts而在运行时使用Contracts
2、对模板优先使用Concepts同时配合使用Contracts
3、可以配合Contracts中的忽略等情况减少或关闭检查,提高运行效率
二者的协同应用,能够更好的构建健壮、安全C++代码。

四、例程

看一个二者协同的例程:

#include <concepts>
#include <contracts>

// Concepts约束
template<typename T>
concept NumCheck = std::integral<T> || std::floating_point<T>;

// Contracts验证
template<NumCheck T>
T DivNum(T t1, T t2) 
    pre(t2 != 0)             
    post( ret: ret >= 0 && ret <= 10)     
{
    contract_assert (t1 >= 2);               
    return (t1 / t2) * 10;
}

int main() {

    auto ret = DivNum(7.0, 3.0);
    
    // err demo:
    // 编译错误(Concepts check)
    DivNum("abc", 5);
    // 运行时错误(Contracts check)
    DivNum(10, 0);
    
    return 0;
}

五、总结

真正的学会贯通一项技术,不是孤单的使用。而是要灵活的应用到各个场景下,与其它的相关技术协作互补,达到彰显优势,弥补劣势,取长补短,互通有无的境界。也就是常说的从单纯的僵化套用到思想上的有机结合。
一定要明白,任何技术都不是孤独的生长在荒漠上的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值