template <bool> struct TAssert;
template <> struct TAssert<true> {};
其使用办法是:
TAssert<false> __Assert;
如果模板参数特化为false则编译器会报错,这样实现了一个编译期的断言,而这个错误几乎在所有编译器上面的输出都是一致的,这个可是一个非常有用的特性啊。
当然了,因为是在编译期确定,所以传入的模板参数必须是常量才可以。
这个东西在boost里面有。
需要包含头文件:
#include <boost/static_assert.hpp>
可以像如下的一些应用:
void expects_ints_to_be_4_bytes() { BOOST_STATIC_ASSERT(sizeof(int)==4);}
template <int i> void accepts_values_between_1_and_10() { BOOST_STATIC_ASSERT(i>=1 && i<=10);}
#include<iostream>
#include "boost/type_traits.hpp"
#include "boost/static_assert.hpp"
template <typename T>
class only_compatible_with_integral_types
{
BOOST_STATIC_ASSERT(boost::is_integral<T>::value);
};
最近我对template技术非常着迷,正好可以打发我郁闷的日子。虽然这项技术多用于库的构建上,在实际应用开发当中的实用价值不高,但是学习到了总归是好的。
boost里面几乎是最全面的应用了,毫无疑问,这么强大的基础库肯定是要毫无保留的去使用它,有点template技术深层次的积累,对于更好的使用boost终归是有益的。