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

compile time vs run time with boost::fusion

本文关键字:fusion 运行时 boost 编译      更新时间:2023-10-16

我对Boost融合很陌生,也许我的问题没有任何意义。融合被描述为:"运行时和编译时算法之间的融合"。我想我在编译时所做的和运行时在融合中所做的之间迷失了方向。

让我们取for_each模板,事实上它们是两个!函数和元函数。元函数在我看来像是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函数和metafunction都是"编译时程序",又错了吗

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

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

如果你仔细查看boost::fusion中的文档,你会发现元函数返回了…:类型这些类型必须在编译时处理。

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

因此,必须在编译时处理类型操作。强制编程构造在编译时并不有用。C++编译时构造更类似于函数式编程构造。我花了很长的时间来说明boost::fusion::for_each是一种在编译时展开循环的算法,这样序列中的所有类型在编译时都可以"以线性方式"可见。

然后,每个类型的值在运行时都是对该类型的取消引用。

因此,在整个循环中,boost::fusion::for_each函数提供了值,boost::fusion::for_ech元函数返回一个类型,这对于通过函数间接获得相关值可能很有用。