现在的位置: 首页 > 综合 > 正文

用泛型编程技术实现对结构体成员的按下标访问( loki 库)–泛型编程之工业应用系列(之一)

2012年12月30日 ⁄ 综合 ⁄ 共 5390字 ⁄ 字号 评论关闭

使用了 loki 库的 typelist 技术. 当然,boost 中也有类似的技术实现。

编译器 : gcc4.0  loki-0.1.6

loki 要求,编译器至少要 gcc3.4 以上版本,vc++7.0 以上版本

一个描述学生信息的c/c++结构体看起来像下面这样:

 

struct studendDetail
{
    
int id;
    
char name[10];
    
char gread[20];
};

 

在后台程序,我们不关注结构体中每个字段的名字。只关注每个字段的类型,占用的内存长度。

OCI 中,应用程序与数据库的数据交互,是通过内存绑定实现的。长长的 bindbyparam()描述字串,像老婆娘的裹脚一样,又长又臭。

我们希望有一种办法,能对数据成员进行操作,不必关注它的数据存储方式,字段名。例如,我们按结构体成员的下标(或曰索引数)来实现对数据成员的操作。

loki 库的 typelist 和 ?  使这种操作成为可能。

 1、定义结构体

在 loki 中,定义一个结构体的方法是

typedef Loki::Tuple< LOKI_TYPELIST_3( int, char[2], double ) >  CGPstruct;
typedef 是泛型编程中的 类型声明关键字。 Tuple 是一个模板类,其有一个成员,名叫 value。

CGPstruct 是我们类的名称。这里意思是它是泛型编程(GP)技术实现的一个结构体。

LOKI_TYPELIST_3( int, char[2], double ) 。

以上,3 表示结构体有三个成员。如果要表示有4个成员的结构体,则是

LOKI_TYPELIST_4( int, char[2], char[4], double )

 loki 库只支持最大18个结构体成员。

/ * 这里还没有落实。 

需要注意的是: loki 技术生成的结构体,与我们 c++中定义的结构体,默认的对齐方式不一样的。loki 结构体中每个成员总是按最大成员的字节对齐。

例如:LOKI_TYPELIST_3( int, char[2], double )  其大小是 24 ,因为 三个元素都按 double 的长度对齐 。

struct

{
int m_a;
char m_b[2];
double m_c;
}

其大小为 16 。

*/

2、定义结构体对象

定义一个结构体对象的语法和 c++ 完全一样:

CGPstruct myGP;

就这么简单,我们可以使用 Field 模板对其进行访问了。

 Loki::Field< 0 >(  myGP  ) = 0;

 

Code

 

3、取元素的地址。

 char[4]  和 int 的取地址的方法不一样。 为了统一,我们声明  TYPELIST 时,给每种元素都加上一个下标。

 

Code

 

这样,我们就可以方便地取元素的地址。

 

     

        cout << Loki::Field< 0 >(pt)  <<  endl;
        cout 
<< Loki::Field< 1 >(pt)  <<  endl;
        cout 
<< Loki::Field< 2 >(pt)  <<  endl;

 

这样做的原理是:由于没有定义精确匹配的转换,编译器将数组退化为指针处理。称做“退化”(decay)。

参见: <c++ templates the complate guide> 5.6 Using String Literals as Arguments for Function Templates

要想获得更详细的资料,可以参考 11.1 The Deduction Process 

4、给元素赋值

传统的 c++ 中,给元素赋值是按元素名称来实现的。在 GP 中,给元素赋值只能通过元素的索引或元素的地址。正如我们上面介绍的一样。

通过元素的索引赋值,需要知道元素的数据类型。因为不同的数据类型赋值方法是不一样的。(例如, char[] 不能通过 "=" 来赋值)。

 

说明:

1、在 loki 库的 0.1.6 之前的版本中, 如果TypeList中有相同的数据类型,则编译时会报错,详细的介绍可参见 loki 的 HierarchyGenerators.h 中第 60行的说明。

 

Code

 

 

 

 

Code

相关资料:

2009 <程序员>有 侯捷的"boost系列",对 boost 库和 loki 库的 typetrain 技术做了详细的介绍。 

 


 

 

抱歉!评论已关闭.