Loki库读解 STATIC_CHECK扩展:可放在任何地方的STATIC_CHECK,编译期打印出类型的大小

原创 2004年04月15日 17:39:00

在Loki的static_check.h中不只有STATIC_CHECK,还有一个STATIC_SIZE_ASSERT。

以前一直忽略了这个STATIC_SIZE_ASSERT,现在突然发现,它是可以写在代码的几乎任何地方的,而STATIC_CHECK只能放在函数中。模仿STATIC_SIZE_ASSERT也实现一个可放在任何地方的STATIC_CHECK并不困难。

Loki作这样的选择,我想应该是这样才能带上额外的msg信息吧。对小项目自用,则可放在任何地方比带额外信息有诱惑多了。

template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
template<int x> struct static_assert_test{};

//#define STATIC_CHECK(expr) do { CompileTimeError<(expr)> STATIC_CHECK_ERROR; (void)STATIC_CHECK_ERROR; }while(0)
#define STATIC_CHECK(expr) typedef static_assert_test<sizeof(CompileTimeError<(expr)>)> static_check_typedef_

由于从事嵌入系统开发,所以总想随时知道某个结构的大小。如果要运行期打印,太麻烦了。所以,想到用下面这个东东在编译期把它打印出来。可惜,这是靠产生编译错误来实现的,我还没法在不影响正常编译的情况下实现这个功能。

#define STATIC_SIZE_TRACE(Type) /
    template<int> struct SizeOf_##Type;/
    typedef static_assert_test<sizeof(SizeOf_##Type<sizeof(Type)>)> static_size_trace_typedef_

关于模板偏特化,模板递归,及Loki之Typelist和一些感悟

一直以来,在大多数情况下,递归被看做是低效率的表现,从学习编程开始,就一直被教导,不用或至少少用递归。但在模板编程中,递归和模板偏特化联合,起了相当大的作用。可以说,没有递归,在很大程度上,模板编程便...
  • kewing
  • kewing
  • 2010年10月23日 11:39
  • 2621

Loki库使用(1)

Loki库使用(1) 2012-11-07 16:44 7090人阅读 评论(2) 收藏 举报 目录(?)[+] C++设计模式类库 Loki介绍与用法 Loki是由Andrei编写的一个与《...
  • zdy0_2004
  • zdy0_2004
  • 2014年10月20日 21:31
  • 1360

Loki库使用介绍

[-] C设计模式类库 Loki介绍与用法 编译 Singleton模式单件模式 头文件类型定义示例代码 对象工厂 Object Factory 头文件类型成员方法示例代码 Abstract ...
  • zhu2695
  • zhu2695
  • 2016年04月25日 22:05
  • 1151

类型转换中的编译错误与运行错误

在继承关系中子类向基类的类型转换可以是隐式的类型转换。例如:(假设Employee类继承于Person类,Monkey类是单独一个类)  Person p = new Employee();  如...
  • u012693072
  • u012693072
  • 2014年06月28日 01:02
  • 326

C++编译时的类型推导

首先明确一点,VisualStudio实现的C++的类型推导是在编译时进行的。 如下代码: #include using namespace std; int main() { int ...
  • Sad_Sugar
  • Sad_Sugar
  • 2016年02月02日 00:39
  • 568

《Modern C++ Design》Loki库源码读解随想

《Modern C++ Design》Loki库源码读解随想大牛Andrei Alexandrescu的《Modern C++ Design》讨论的是C++语言的最前沿研究:generative pr...
  • taodm
  • taodm
  • 2002年07月23日 10:52
  • 7367

Loki库读解-扩展TypeList:Typelist生成器、MaxSizeOf

Loki中的TYPELIST_**宏还是太难用了,因为无法支持不定参数。借鉴于BOOST中的Tuple的想法,实现了这个Typelist_Maker:template         class T6...
  • taodm
  • taodm
  • 2004年04月08日 18:51
  • 1677

C++编译期的类型测试

编译期的类型测试 一、使用模板特化机制 如比较两个类型是否一致: VC8及以后版本支持了type traits机制: add_const Class            ...
  • wcyoot
  • wcyoot
  • 2014年06月21日 20:34
  • 1295

【C++】Loki库源码读解随想

《Modern C++ Design》Loki库源码读解随想 大牛Andrei Alexandrescu的《Modern C++ Design》讨论的是C++语言的最前沿研究:generative ...
  • little_stupid_child
  • little_stupid_child
  • 2017年01月14日 18:28
  • 119

Java中编译期、运行期、堆内存和栈内存详解

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空...
  • wtxwd
  • wtxwd
  • 2016年09月29日 17:19
  • 711
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Loki库读解 STATIC_CHECK扩展:可放在任何地方的STATIC_CHECK,编译期打印出类型的大小
举报原因:
原因补充:

(最多只允许输入30个字)