今天介绍OpenFOAM中实现的几个最基本的东西:bool、 int及label在介绍这几个之前首先介绍一个特殊的类pTraits(primitive trait的简写,意思即为primitive类的基本特征),正如其名字所示该类用于描述所有primitive类的基本特征。那么primitive类都有哪些基本特征呢,让我们来看看类pTraits的定义:template<class primitive>class pTraits: public primitive //这里可以看出来pTraits为primitive的子类{public: pTraits(Istream& is) : primitive(is) {}};是不是很简单啊,不过对于每一个具体的primitive类型,pTraits类都进行了特化。因为是primitive类的子类所以可以通过特化为特定的primitive类加上我们希望它具有的特性。 下面分别从bool、label介绍pTraits的这种特化: 对于bool,特化了pTraits<bool>成员变量(私有): bool p_; //私有的数据成员公有属性: 静态常量成员://所有的pTraits<primitive>都实现了以下几个常量 static const char* const typeName="bool"; static const char* componentNames={"x"}; static const bool zero=0; static const bool one=1; 类型定义: typedef bool cmptType;//所有的pTrait都有这个类型 cmptType 成员常量: enum { dim = 3; //定义三维定义 rank = 0; //定义bool型(实际为pTraits<bool>)的秩 nComponents = 1; //定义元素个数 }; 构造函数: pTraits(Istream & is); //从输入流构造类 成员函数: operator bool() const {return p_;} //类型转换函数全局函数: bool readBool(Istream & is); //从输入流中读入bool变量对于label,特化了pTraits<label>成员变量(私有): label p_; //私有的数据成员公有属性: 静态常量成员://所有的pTraits<primitive>都实现了以下几个常量 static const char* const typeName="label"; static const char* componentNames={"x"}; static const bool zero=0; static const bool one=1; 类型定义: typedef label cmptType;//所有的pTrait都有这个类型 cmptType 成员常量: enum { dim = 3; //定义三维定义 rank = 0; //定义bool型(实际为pTraits<bool>)的秩 nComponents = 1; //定义元素个数 }; 构造函数: pTraits(Istream & is); //从输入流构造类 成员函数: operator label() const {return p_;} //类型转换函数全局函数: label readLabel(Istream& is) //从输入流读取label变量 label pow(label a, label b);// 返回a的b次幂 label nCr(label n, label r); //Cnr,组合数 label factorial(label n);//n的阶乘 label mag(label n); //n的绝对值 label sign(label n); //n的符号 n>=0返回1,n<0返回-1 label pos(label n); //n>0返回1,否则返回0 label neg(label n);//n<0返回1,否则返回0 通过上面的介绍,可以看出pTraits<primitive>将为primitive增加以下这些属性: cmptType;//表明primitive的元素类型 rank;//primitive的秩 dim;//primitive所属空间的维数 nComponets;//primitive中元素个数 typeName;//类的名字 componentNames[];//类的成员的名字 zero;该类的零primitive one;该类的单位primitive今天到这里!<未完,待续……>

评论