编译时断言

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终归是有益的。

时间: 2024-11-02 12:03:48

编译时断言的相关文章

运行时和编译时元编程—编译时元编程

原文链接    译文链接     译者:JackWang 运行时和编译时元编程 第二部分 2 编译时元编程 Groovy的编译时元编程支持编译时生成代码.这些变换(译者注:原文该专有名词是transformations,译者直译为变换,也许不准确.如果有知道准确翻译的读者恳请不吝赐教,待译者修正)叫做程序的抽象语法树(AST),在Groovy里,我们叫做AST变换.AST变换支持在编译过程中植入钩子,修改抽象语法树之后继续编译生成正常的字节码流.和运行时元编程相比,这种转换可以在类文件的修改可见

Go 语言编译期断言

这篇文章是关于一个鲜为人知的让 Go 在编译期断言的方法.你可能不会使用它,但是了解一下也很有趣. 作为一个热身,来看一个在 Go 中熟知的编译期断言:接口满意度检查. 在这段代码(playground)中,var _ = 行确保类型 W 是一个 stringWriter,其由 io.WriteString检查. package main import "io" type W struct{} func (w W) Write(b []byte) (int, error) { retu

编译时MSIL注入--实践Mono Cecil(1)

   紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务-MSBuild Task(csproject),在第一篇中我们简单研究了c#语法糖和PostSharp的MSIl注入,紧接第二篇中我们介绍了自定义MSBuild编译任务(记得有位老兄发链接用 MSBuild自动发布Silverlight xap ,我想说的我做的是自定义编译任务,不是什么发布,MSBuild本就是一个发布工具).之所以在此前介绍编译Task是因为我讲介绍的就是利用MSBuild和MSILInje

ndk-Android NDk 怎么编译时动态链接第三方so库,有头文件

问题描述 Android NDk 怎么编译时动态链接第三方so库,有头文件 最近在做一个项目,大神把底层的算法封装成so(普通的c++函数),并给出头文件,我需要先 进行封装,然后给java调用.在我写的C++(符合JNI规范)里面调用so库函数, 下面贴图求解答: 1.项目的目录结构 其中 libvvw.so就是第三方库: Test_vvw.h就是第三方库的头文件 2.java 的native方法定义 3.native的实现方法体 FrameDecode.cpp文件 4.Android.mk文

运行时和编译时元编程—运行时元编程

原文链接   译文链接   译者:JackWang 运行时和编译时元编程 第一部分 Groovy语言支持两种风格的元编程:运行时元编程和编译时元编程.第一种元编程支持在程序运行时修改类模型和程序行为,而第二种发生在编译时.两种元编程有各自的优缺点,在这一章节我们将详细讨论. 注:译者也是第一次接触Groovy,由于时间和水平有限(姑且让译者使用这个理由吧,对待知识本应该一丝不苟)部分专有名词可能翻译不准确甚至有误(读者阅读的过程中最好能参考原文),恳请读者不吝留言指出,谢谢! 1.运行时元编程

编译时标签(对JSP进行的XSLT预处理)

js|编译 一篇旧文,翻出来回顾一下.BTW,抗议csdn的分类,XML怎能归于.NET之下!! 发信人: HAX(海曦), 信区: WebDevelop 标 题: 发信站: 饮水思源 (2002年02月12日00:10:32 星期二), 站内信件 编译时标签(对JSP进行的XSLT预处理) 原文:http://www.mail-archive.com/taglibs-dev@jakarta.apache.org/msg00390.html From: James Strachan Subjec

强制编译时约束

通用的约束和算法常常给所处理的对象强加某些限制.例如,std::sort()算法需要其操 作的对象元素定义 < 操作符.强制此约束很容易:编译器尝试针对给定类型调用该操作 符.如果这个操作符不存在,你会得到一个编译错误: #include <algorithm> struct S{}; //doesn't define operator < int main() { S s[2]; std::sort(s, s+2); // 出错: 在类型 'S'中 'operator<'

编译时找不到xxx.pch

Unexpected end while looking for precompiled header这时因为该模块没有包括预编译头文件"stdafx.h"的缘故. VC用一个stdafx.cpp包含头文件stdafx.h,然后在stdafx.h里包含大部分系统头文件,这样编译时VC就通过编译stdafx.cpp把大部分系统头文件预编译进来了,在Debug目录下有一个很大的文件*.pch,这里就存储了预编译信息. 根据这个原理,如果这个pch损坏了或被删除了,系统重新编译时就会抱怨&q

指针-求大神解答一下linux内核编译时键盘驱动模块出现了问题!新手求助!谢谢!

问题描述 求大神解答一下linux内核编译时键盘驱动模块出现了问题!新手求助!谢谢! 编译的时候,就出现了这几个错误,然后我就一直不能编译内核, 估计是指针的问题,但是我又不知道应该如何解决, 已经卡了我差不多两个星期了,一直都解决不了,跪求大神指点! 谢谢! 解决方案 在编译之前,有没有用#cp -f config_tq板的具体的名字 .config复制tq板的配置文件?