WEB开发网
开发学院软件开发VC 强制编译时约束 阅读

强制编译时约束

 2008-03-27 21:40:35 来源:WEB开发网   
核心提示: 改进设计约束能导致运行时和空间上的开销吗?如果它在编译时检查,你肯定不想让它呆在可执行文件中,强制编译时约束(3),现代 IDEs 都很聪明, 将可执行文件中不必要的代码优化掉,其它兴趣包括考古和地理,Danny 时常到一些 C++ 论坛并定期为不同的 C++ 网站和杂志撰写文章,为了让编

改进设计

约束能导致运行时和空间上的开销吗?如果它在编译时检查,你肯定不想让它呆在可执行文件中,现代 IDEs 都很聪明, 将可执行文件中不必要的代码优化掉。为了让编译器报错,将约束移到一个单独的静态成员函数 constraints() 中(你也可以另外的函数名)。记住声明时时这个成员是 private,以便其它程序无法调用它:

template <class T> struct POD_test
{
  POD_test(){constraints();} // 强制编译时处理
private:
  static void constraints()
  {
    union{ T t;} u;
  }
};

注意 constraints() 函数实际上什么也没做,它只是声明了一个局部联合类型的变量。由于该联合变量没有被使用,编译器可以省略掉这个构造函数中的 constraints(),从而避免了必要的开销。

“必须是 POD ” 只是众多强制约束中一个案例。另一个常用的约束是“必须是 T”,实现这个约束也非常简单:

//检查 T1 是否为 T2
template <class T1, class T2> struct is_a_T2
{
  is_a_T2() {constraints();}
  static void constraints()
  {
    T1 t1;
    T2& ref=t1; // 如果 t1 不是 t2 则出错
  }
};

这里是另外一个约束:“必须是一个整型”,这个也不难,有多种技术途径来实现。其中之一就是是使用该对象作为某个数组的下标。因为 C++ 需要整型作为下标,使用任何其它的类型都将导致编译错误。我将这个实现留给读者来做。

Danny Kalev 是一名通过认证的系统分析师,专攻 C++ 和形式语言理论的软件工程师。1997 年到 2000 年期间,他是 C++ 标准委员会成员。最近他以优异成绩完成了他在普通语言学研究方面的硕士论文。 业余时间他喜欢听古典音乐,阅读维多利亚时期的文学作品,研究 Hittite、Basque 和 Irish Gaelic 这样的自然语言。其它兴趣包括考古和地理。Danny 时常到一些 C++ 论坛并定期为不同的 C++ 网站和杂志撰写文章。他还在教育机构讲授程序设计语言和应用语言课程。

上一页  1 2 3 

Tags:强制 编译 约束

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接