强制编译时约束
2008-03-27 21:40:35 来源:WEB开发网通用的约束和算法常常给所处理的对象强加某些限制。例如,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() 就是一个例子。参见下列表达式:
更多精彩
赞助商链接