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的功能就是通过索引来取得基类的类型,然后将其强制转换推到出目的类型,将值取出。