今天介绍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
今天到这里!
<未完,待续……>
评论