模版之编译期断言


title: 模版之编译期断言
date: 2023-02-20 20:28:08
permalink: /pages/83d2a5/
categories:


模板之编译期断言

assert是在运行期的断言,会导致abort,很少被使用,我们可以利用模板实现编译期的断言。

在《Modern C++ Design》中介绍了利用大小为0的数组是非法的,也就是char unamed[0];但是事实上这需要编译选项(-pedantic-Wzero-length-array)支持,因为C/C++是支持这个用法的,用于变长结构体。

简单介绍一下利用这个特性是怎么做编译期断言的。代码如下:

#define Check(expr)                  \
    {                                \
        char unamed[(expr) ? 1 : 0]; \
        (void)(unamed);              \
    }

接下来我们利用模板来实现。这里需要用到std::enable_if(C++11起),它的实现也比较简单,利用了模板的偏特化,只能实例化enable_if<true, T>

template<bool B, class T = void>
struct enable_if {};
 
template<class T>
struct enable_if<true, T> { typedef T type; };

我们利用这个特点实现编译期断言。代码如下:

#define Check(expr)                                           \
    {                                                         \
        typename std::enable_if<(expr), void>::type unamed(); \
    }

如果是C++14就更简洁一点。

#define Check(expr)                              \
    {                                            \
        std::enable_if_t<(expr), void> unamed(); \
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值