强制编译时约束

豆豆网   技术应用频道   2008年03月27日  【字号: 收藏本文

内容摘要:实现某些约束需要太多的力气活,如果能找到某种通用方式实现那些更抽象的约束那就最好了,本文下面的解决方案将展示如何实现。

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

  但是,要表达约束以及强制执行约束并不是一件容易的事情。很多抽象的约束比如:“必须是一个基类”或“必须是一个 POD 类型”需要来自程序员更多的灵活性和技巧。本文下面将示范如何一通用的方式实现此类约束。

  如何以通用的方式强制执行对象的编译时约束?

  使用“约束模板”自动强制执行编译时约束

  提出问题

  假设你的应用程序需要一个接口,这个接口是用 C 或者 SQL 编写的非C++模块。为此,你需要保证传递到非C++模块的所有对象具备 POD 类型。

struct S1 { int x;};
class S2 { public: void func(); };
union S3 { struct { int x, y; } t; char c[4];};
struct S4 : S1, S2 {};

  以上数据都是 POD 类型,而下面这些则不然:

struct C1 {
    virtual void func(); //有一个虚函数
};
struct C2 {
    struct T{ int x, y; };
    ~C2(); //有一个析构函数
};
struct C3 : virtual S1 {} ; //有一个虚拟基类

  在个别编程实现中 POD 和 非 POD 的使用是有严格区分的,在<csstddef> 中定义的标准宏 offsetof() 就是一个例子。参见下列表达式:

来源:MTT 工作室    作者:Danny Kalev    责编:豆豆技术应用

正在加载评论...