boost的fusion篇之container

来源:互联网 发布:java企业开发平台 编辑:程序博客网 时间:2024/04/30 03:33

fusion的意思是融合,将很多的模板技术融合进来,fusion中划分了很多的子模块,包含适配器模块(adapter)、算法模块(algorithm)、容器(container)、函数功能(functional)、迭代(iterator)、元编程(mpl)、序列(sequence)、元祖(tuple)、视图(view),今天就简单说下fusion的容器模块,fusion的容器跟咱们使用的tuple很类似,而且fusion的容器还引入了迭代的概念。所以其操作模式跟STL的vector非常相似。tuple的核心机制,我在TypeList的实现中已经说过,其核心是利用TypeList的列表递归特性,加上GenScatterHirerarchy通过模板的模板参数来生成的,有兴趣的请查看我博客里Loki关于TypeList的说明部分。情况如下fusion的vector的使用说明:

vector<int, float> v(12, 5.5f);std::cout << at_c<0>(v) << std::endl;std::cout << at_c<1>(v) << std::endl;

可以看出其实fusion的用法和tuple是非常相似的,采用模板参数构造的矢量容器,然后通过索引值来递归出数据结果。这里at_c这个模板函数的功能其实和Loki中Filed的函数功能是一样的,都是通过内部的模板推到将其强制转换,由于vector的形成是通过不规则的继承关系过来的相当于有这么一个结构体

struct NullType

{

};

struct s1 :public NullType

{

int m_value;

};

struct s2 : public NullType

{

  float m_value;

};

struct s :public s1, public s2

{

};

而这里的s就相当于执行了typedef vector<int, float> s;的操作。由于成员变量名称一样,所以在取值的时候就不能直接取了,要么将其转换为基类对象然后取值,否则同名的就会出现歧义。而at_c的功能就是通过索引来取得基类的类型,然后将其强制转换推到出目的类型,将值取出。


1 0
原创粉丝点击