我对Boost融合很新,也许我的问题没有任何意义。 Fusion表示为:“运行时和编译时算法之间的融合”。我想我在编译时完成的工作和融合运行时的工作之间迷失了。
让我们采用for_each
模板,实际上它们是两个! function和metafunction。
元函数看起来像是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的哪个部分只是编译时元程序,什么才是经典的编译时代码?
答案 0 :(得分:2)
boost :: fusion是关于异构类型集合的操作。在C ++中,类型的处理在编译时处理(元函数),而值操作主要在运行时(函数)处理。
如果仔细观察boost :: fusion中的文档,您会发现元函数返回的内容如... :: type。这些类型必须在编译时处理。
在C ++中,有类似RTTI(运行时类型信息)的东西,但在大多数情况下,它的能力被降级为在运行时识别某事物的类型。在运行时没有可用的类型操作。
因此,必须在编译时处理类型操作。命令式编程构造在编译时没有用。 C ++编译时结构更类似于函数式编程结构。我在很长的路要说boost :: fusion :: for_each是一个在编译时展开循环的算法,这样序列中的所有类型都可以在编译时“以线性方式”显示。
每种类型的值在运行时都是对类型的取消引用。
如此完整的循环,boost :: fusion :: for_each函数提供了值,boost :: fusion :: for_each元函数返回一个类型,这对于通过仿函数间接获取相关值非常有用。