boost静态断言的简单实现

boost的静态断言可以实现在编译器就检测错误的类型或语法错误,能降低运行时可能发生的错误情况,充分利用编译器提供的优势。静态断言的核心实现是通过模板的偏特化来只声明不实现,如下是我实现的一个简单的静态断言

template<bool>

struct static_assert;

template<>

struct static_assert<true> {};

这里实现了true模式的类实现,但是没有实现false模式的类实现,所以如果一旦条件是false,声明一个static_assert的变量则肯定会编译失败

定义一个static_assert的变量就完成了条件的判断

static_assert<Cond>();

这里我们来定义一个宏来简化这个工作

#define STATIC_ASSERT(Cond) \

(void)static_assert<Cond>()

所以最后的结果就是

STATIC_ASSERT(0==0);

STATIC_ASSERT(1==0);//编译不过

时间: 2024-12-06 18:27:22

boost静态断言的简单实现的相关文章

转:探索C++0x: 1. 静态断言(static_assert)

转自:http://www.cppblog.com/thesys/articles/116985.html 简介 C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言. 其语法很简单:static_assert(常量表达式,提示字符串). 如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提

boost编译配置及简单使用

boost编译配置及简单使用 1.下载 http://www.boost.org/ 2.编译: A.解压 boost_1_55_0.zip 到boost路径 B.运行 bootstrap.bat. 会生成2个文件,分别是bjam.exe 和 b2.exe. bjam是早起的文件,新版本用b2比较好 C.可以查看b2.exe的用法,在cmd里面输入 "b2 --help" 这里基本上有各个参数的用法和意思. boost全部编译会消耗很多时间,一般需要编译的是与操作系统相关的. 可以用命令

C++11 静态断言(static_assert)

简介 C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言. 其语法很简单:static_assert(常量表达式,提示字符串). 如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提示字符串. 说明 使用static_assert,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契

C++11 新特性,运行时断言与静态断言

C98或C99中的库为:<cassert> 或<assert.h> 运行时断言,故明思议是当程序在运行的时候才作为判决,可以认为是对参数的有效性的判断. 而静态断言,是对参数的条件判断提前做了,在预编译的时候进行完成的.如: //demo1.cpp #include <cassert> using namespace std; char *arrayAolloc(int n){ assert(n>0); return new char [n]; } int mai

用vs2010编译vigra静态库及简单使用举例

1.  从 http://ukoethe.github.io/vigra/ 下载最新源代码vigra-1.10.0-src-with-docu.tar.gz,并加压缩到D:\soft\vigra,生成vigra-1.10.0文件夹: 2.  从http://www.cmake.org/cmake/resources/software.html下载CMake并安装: 3.  打开CMake,Where is thesource code: D:/soft/vigra/vigra-1.10.; Wh

【C/C++学院】0816-引用包装器/仿函数/转义字符 R”()”/using别名/模板元编程 比递归优化/智能指针/多线程/静态断言以及调试技能的要求 assert

引用包装器  std::ref(变量) #include<iostream> template<class T> void com(T arg)//模板函数,引用无效,引用包装器 { std::cout <<"com ="<< &arg << "\n"; arg++; } void main() { int count = 10; int & rcount = count; com(coun

PHP静态延迟绑定简单示例

没怎么用过这个新特性,其实也不算新啦,试试吧,现在静态类的继承很方便了 <?php class A { protected static $def = '123456'; public static function test() { echo get_class(new static); } public static function test2() { echo static::$def; } } class B extends A { protected static $def = '4

C++断言与静态断言

断言是很早之前就有的东西了,只需要引入cassert头文件即可使用.往往assert被用于检查不可能发生的行为,来确保开发者在调试阶段尽早发现“不可能”事件真的发生了,如果真的发生了,那么就表示代码的逻辑存在问题.最好的一点就是,断言只在Debug中生效,因此对于Release版本是没有效率上的影响的. #include <iostream> #include <cassert> using namespace std; int main() { int i = 22; asser

C++11 特征之 静态断言

C++11 支持 静态断言,和之前的 assert 运行时断言机制形成互补 调用形式: static_assert(sizeof(int) == 4, "error: (int) size error "); 当条件不满足的时候,编译器就是提示后面的那句话 要注意的就是 静态断言条件 最好写在函数体的外面 ,这样和可以和函数调用区分开来.