ZhiBing's blog(码上看世界) ZhiBing's blog(码上看世界)
首页
  • Linux工具链

    • shell命令
  • 构建

    • CMake
    • Makefile
  • 版本管理

    • Git
    • Github
  • IDE及工具

    • vscode
    • CLion
  • 设计模式

    • 设计原则
  • 编程语言

    • C++
    • Go
    • Python
    • Shell
  • 调试

    • gdb
  • 开发者测试

    • gtest
  • 系统支撑

    • 操作系统
  • 性能优化

    • 编译优化选项
    • perf
    • valgrind
  • 容器

    • Docker
  • 微服务

    • Rancher
  • 其他
  • 随笔
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

ZhiBing Zheng

时间会回答成长
首页
  • Linux工具链

    • shell命令
  • 构建

    • CMake
    • Makefile
  • 版本管理

    • Git
    • Github
  • IDE及工具

    • vscode
    • CLion
  • 设计模式

    • 设计原则
  • 编程语言

    • C++
    • Go
    • Python
    • Shell
  • 调试

    • gdb
  • 开发者测试

    • gtest
  • 系统支撑

    • 操作系统
  • 性能优化

    • 编译优化选项
    • perf
    • valgrind
  • 容器

    • Docker
  • 微服务

    • Rancher
  • 其他
  • 随笔
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • 编程语言

    • C++

      • shared_ptr(智能指针)
      • unique_ptr
      • bind函数
      • cout
      • C++ main函数的传入参数(argc, argv)
      • GLog使用
      • signals2
      • 编译期分派
      • 成员函数的调用效率
      • 返回值优化
      • 函数调用栈
      • 空类大小
      • 指针和数组的区别
      • 遵守三五原则
      • const限定符
      • static限定符
      • virtual限定符
      • 常用的CXX_FLAGS
      • 模版之AnyType
      • 模版之编译期断言
      • 模版之变参模板
    • Go

    • Python

    • shell

    • Rust

  • 调试

  • 开发者测试

  • 系统支撑

  • 性能优化

  • 通用领域
  • 编程语言
  • C++
zhengzhibing
2023-02-20

模版之编译期断言

# 模板之编译期断言

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);              \
    }
1
2
3
4
5

接下来我们利用模板来实现。这里需要用到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; };
1
2
3
4
5

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

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

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

#define Check(expr)                              \
    {                                            \
        std::enable_if_t<(expr), void> unamed(); \
    }
1
2
3
4
#C++#元编程
上次更新: 2023/02/20, 20:30:38
模版之AnyType
模版之变参模板

← 模版之AnyType 模版之变参模板→

最近更新
01
HPE gen10 plus 安装ESXI 7
06-12
02
ESXI 7安装黑群晖
06-12
03
ESXI 7安装win10
06-12
更多文章>
Theme by Vdoing | Copyright © 2022-2024 ZhBing Zheng | 粤ICP备2022062743号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式