2015-08-17 118 views
-1

我正在阅读有关C++元编程的Abrahams,Gurtovoy书。我必须承认,我不明白使用模板元编程的解释。例如:C++元编程,为什么和什么时候应该使用?

您想要根据问题域的抽象表示代码。

或者:

否则你将不得不写的样板实现代码很大。

有人能详细说明吗?

+0

关于亚马逊的第一章,我看到它立即开始通过详细解释并举例说明。 –

回答

2

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

同样,可能会写入,比方说,一个模板样条内插,可以内插Y(X)的任何类型的x实现标量的概念(订购,运营商+-*),然后键入y即interpolateable(允许y+y,y-yy*x)。一旦你建立了这样一个模板,你就可以使用它来插入,比如double(代表时间)的某种矩阵类型,而不需要进一步的改编:它只是立即生效(尽管编译器必须做一些工作)。

1

您想要根据问题域的抽象表示代码。

模板元编程(TMP)可用于分离和抽象代码中的不同任务。例如,Boost.Serialization被实现为完全不知道您的(用户)代码。你只需要提供一些粘合剂,以一种serialize()成员函数的形式提供,而Boost.Serialize将能够无缝地与你的类一起工作。由于这些都是在编译期间完成的,所以这种灵活性并不会导致运行成本(与多态性相反)。

否则,您将不得不编写大量的样板实现代码。

TMP技术可用于生成代码,并有效地分解通用代码。例如,Boost.Intrusive可让您在类中(通过各种方式,例如继承或类型特征)“导入”行为,而这只不过是生成代码并将其注入到类中以将其转换为列表,例如列表节点。

+0

Thanks.I打算使用C++进行科学计算,序列化是否用于此? –

+0

@RichardRublev这些是我头顶的两个例子,我不知道这两个特定的东西对你是否有用。然而,科学计算看起来像一个可以使用TMP进行编译时抽象的领域,并且真正受益于速度提升(与“经典”,多态驱动的抽象相比)。 – Quentin

相关问题