使用boost :: fusion编译时间与运行时间

时间:2013-11-20 18:21:07

标签: c++ boost-fusion

我对Boost融合很新,也许我的问题没有任何意义。 Fusion表示为:“运行时和编译时算法之间的融合”。我想我在编译时完成的工作和融合运行时的工作之间迷失了。

让我们采用for_each模板,实际上它们是两个! functionmetafunction。 元函数看起来像是for_each函数的特征类模板,错误?

for_each函数为例:

struct increment
{
    template<typename T>
    void operator()(T& t) const
    {
        ++t;
    }
};

vector<int,int> vec(1,2);
for_each(vec, increment());

我知道for_each循环将在编译时展开,以生成像

这样的代码
++at_c<0>(vec); 
++at_c<1>(vec);

(显然at_c<x>模板也会生成访问融合矢量成员的代码)

对我来说,for_each函数和元函数都是“编译时间程序”,又错了吗?

有人可以解释一下(举一个简单的例子)boost boost的哪个部分只是编译时元程序,什么才是经典的编译时代码?

1 个答案:

答案 0 :(得分:2)

boost :: fusion是关于异构类型集合的操作。在C ++中,类型的处理在编译时处理(元函数),而值操作主要在运行时(函数)处理。

如果仔细观察boost :: fusion中的文档,您会发现元函数返回的内容如... :: type。这些类型必须在编译时处理。

在C ++中,有类似RTTI(运行时类型信息)的东西,但在大多数情况下,它的能力被降级为在运行时识别某事物的类型。在运行时没有可用的类型操作。

因此,必须在编译时处理类型操作。命令式编程构造在编译时没有用。 C ++编译时结构更类似于函数式编程结构。我在很长的路要说boost :: fusion :: for_each是一个在编译时展开循环的算法,这样序列中的所有类型都可以在编译时“以线性方式”显示。

每种类型的值在运行时都是对类型的取消引用。

如此完整的循环,boost :: fusion :: for_each函数提供了值,boost :: fusion :: for_each元函数返回一个类型,这对于通过仿函数间接获取相关值非常有用。