我对 Boost fusion 还很陌生,也许我的问题没有任何意义。 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>
模板也会生成访问融合 vector 成员的代码)
对我来说,for_each函数和元函数都是“编译时程序”,又错了?
有人可以向我解释一下(用一个简单的例子)boost fusion的哪一部分只是编译时元程序,什么是经典编译时代码吗?
最佳答案
boost::fusion 是关于异构类型集合的操作。在 C++ 中,类型的处理是在编译时处理的(元函数),而值操作主要是在运行时处理的(函数)。
如果您仔细查看 boost::fusion 中的文档,您会发现元函数返回诸如 ...::type 之类的内容。这些类型必须在编译时处理。
在 C++ 中,有类似 RTTI(运行时类型信息)的东西,但在大多数情况下,它的能力被降级为在运行时识别某些内容的类型。运行时没有可用的类型操作。
因此,类型操作必须在编译时处理。命令式编程结构在编译时没有用处。 C++ 编译时构造更类似于函数式编程构造。我花了很长时间才说 boost::fusion::for_each 是一种在编译时展开循环的算法,以便序列中的所有类型在编译时“以线性方式”可见。
每种类型的值都会在运行时对该类型进行取消引用。
如此一来,boost::fusion::for_each 函数提供值,而 boost::fusion::for_each 元函数返回一个类型,这对于通过仿函数间接获取关联值非常有用。
关于c++ - boost::fusion 的编译时间与运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103847/