喜欢这篇文章吗?喜欢的话去看博主的置顶博客,即可依据分类找到此文章的原版得到更好的体验,
图片及代码显示的问题,笔者深感抱歉,想要更好的体验去原博文即可。
title: c++重学笔记18 - 静态断言检查器
mathjax: true
date: 2020-03-15 22:44:18
categories: [c++重学笔记]
tags: [c++重学笔记]
keywords: [c++重学笔记]
我们来实现一个静态断言检查器
最前面给了一个基于构造长度为0的数组的断言检查,我的编译器似乎很强大,允许我这样操作了。。。。我们就忽略他吧
现在考虑到模版,我们定义一个bool型的模版,对其中的true型偏特化进行实现,false型不实现,当我们用这个类构造的时候,true会被编译通过,但是false就不行了,
第二种情况是,利用构造函数,似乎还是编译器原因,我的都能编译通过,我们也忽略吧。
第三种情况,我们考虑用宏把msg替换成一个字符串,这样就OK了,报错的时候还能看到是啥错,你只要输入msg就可以。
namespace program_check {
// 第一种静态检查方法
template <bool>
struct CompiledTimeError;
template <>
struct CompiledTimeError<true> {};
// 第二种静态检查的方法
template <bool>
struct CompiledTimeCheck {
CompiledTimeCheck(...){};
};
template <>
struct CompiledTimeCheck<false> {};
} // namespace program_check
// 第一代静态检查器
#define STATIC_CHECK_1(expr) program_check::CompiledTimeError<(expr) != 0>()
// 第二代静态检查器,还能输出错误类型
//#define STATIC_CHECK_2(expr, msg) \
{ \
class ERROR_##msg {}; \
(void)sizeof( \
program_check::CompiledTimeCheck<(expr) != 0>(ERROR_##msg())); \
}
// 我觉得都不太好,不如试试这个
#define STATIC_CHECK(expr,msg) \
(program_check::CompiledTimeError<(expr) != 0>(), "msg")
int main(int argc, char** argv) {
STATIC_CHECK(false,abssf );
}