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

强制编译时约束

 2008-03-27 21:40:35 来源:WEB开发网   
核心提示:通用的约束和算法常常给所处理的对象强加某些限制,例如,强制编译时约束,std::sort()算法需要其操作的对象元素定义 < 操作符,强制此约束很容易:编译器尝试针对给定类型调用该操作符,struct S1 { int x;};class S2 { public: void func(); };union S3

通用的约束和算法常常给所处理的对象强加某些限制。例如,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() 就是一个例子。参见下列表达式:

1 2 3  下一页

Tags:强制 编译 约束

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