模版之编译期断言
# 模板之编译期断言
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
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
2
3
4
5
我们利用这个特点实现编译期断言。代码如下:
#define Check(expr) \
{ \
typename std::enable_if<(expr), void>::type unamed(); \
}
1
2
3
4
2
3
4
如果是C++14就更简洁一点。
#define Check(expr) \
{ \
std::enable_if_t<(expr), void> unamed(); \
}
1
2
3
4
2
3
4
上次更新: 2023/02/20, 20:30:38