——2.1Compile-Time Assertions
其实,但从编译期assert得角度而言,我们不需要template技术就可以,但是,那样我们无法得到详细得出错信息:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
这里有三点需要注意:
1.大小为0得数组是非法的,不知道这个没有关系,你的编译器会提醒你,但是知道这个你的设计空间将被扩展。
2.我们可以正确assert,但是无法获取丰富的错误信息。如果有问题,编译期会提示你你试图产生一个长度为0得数组。其他没有什么了,这是我们不想看到的。
3.如果使用template,编译器会在错误信息里指出template得名字。
为了弥补第2点提到的问题,我们利用第3点的事实:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
注意这已经足够了,但是我们总想让事情变得更好:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
请注意这里没有什么,只是在出错的时候,定义了一个类,让后把这个类得一个对象传给CompileTimeErrorChecker<expr>得构造函数,试图构造一个对象,但这是不行的,并没有接受如此参数的构造函数(其实ERROR_##msg是个局部类,要是真的让CompileTimeErrorChecker<expr>知道这个类,反而是一件比较难的事),所以编译器会提示你说无法转换ERROR_##msg到CompileTimeErrorChecker<expr>,这太好了,编译器会显示你定制的信息。