C++元编程,为什么以及什么时候应该使用?

C++ metaprogramming,why and when should be used?

我正在阅读 Abrahams、Gurtovoy 关于 C++ 元编程的书。我必须承认我没有正确理解那里关于使用模板元编程的解释。例如:

You want the code to be expressed in terms of the abstractions of the problem domain.

或者:

You would otherwise have to write a great deal of boilerplate implementation code.

有人可以详细说明一下吗?

You want the code to be expressed in terms of the abstractions of the problem domain.

模板元编程 (TMP) 可用于分离和抽象代码中的不同任务。例如,Boost.Serialization 的实现完全不知道您(用户)的代码。您只需以 serialize() 成员函数的形式提供一点胶水,Boost.Serialize 就可以与您的 class 无缝协作。由于这一切都是在编译时进行的,因此这种灵活性不会以任何运行时成本为代价(与多态性相反)。

You would otherwise have to write a great deal of boilerplate implementation code.

TMP 技术可用于生成代码,并有效地分解公共代码。例如,Boost.Intrusive 允许您在 classes 中进行 "import" 行为(通过各种方式,例如继承或类型特征),这只不过是生成代码并将其注入您的class 将其转换为例如列表节点。

我也使用 C++ 进行科学计算,是的,模板元编程非常有用。一种用途是帮助实现通用数值方法。一个典型的例子是std::sort,它是一种抽象的排序方式,它适用于任何你想排序的东西。

类似地,您可以编写一个模板样条插值,它可以为实现标量概念的任何类型 x 插值 y(x)(可排序,运算符 + - *) 并键入可插值的 y(允许 y+yy-yy*x)。一旦建立了这样的模板,就可以使用它在 double(例如代表时间)上插入一些矩阵类型,而无需任何进一步的调整:它可以立即工作(编译器必须做一些工作, 虽然).