C ++元模板:一个好的或坏的设计选择?

时间:2009-06-28 17:33:55

标签: c++ metaprogramming

我很想知道C ++元模板是否以及何时适用于从小到大的系统。我知道他们会增加您的构建时间,以加快您的执行时间。但是,我听说很多开发人员很难理解元模板代码,这对于在一个拥有非常大的代码库(数百万行代码)的系统上工作的大群人来说可能是一个问题。您认为C ++元模板在哪里有用(或不是)?

6 个答案:

答案 0 :(得分:4)

元编程只是(C ++)程序员工具箱中的另一个工具 - 它有许多很棒的应用程序,但是任何东西都可能被误用或过度使用。我认为它在“难以使用”方面声名狼借,我认为这主要来自于它是语言的重要补充,因此需要一段时间才能学习。

作为现实世界使用的一个例子;我过去曾使用模板元编程来实现编译时断言和shim库;实现这些没有模板将是不可能的或需要比我写的更多的代码。

在shim库的情况下,它可以以经典的面向对象的方式实现,该方式可能被设计为具有与模板化实现类似(低)级别的代码重复;但是它的运行时性能会明显变差。

如果你想看一些如何使用它的好例子,我建议你阅读Andrei Alexandrescu的Modern C++ Design(发布者网站上有一个sample chapter) - IMO这是其中一个关于这个主题的最好的书。

答案 1 :(得分:4)

模板元编程不会使您的代码“本质上难以理解”。它改变了复杂性。底层的元编程代码可能很难理解,但同时,它通常会简化客户端代码。

如果它的效果只是使代码难以阅读,则不会使用它。它不时使用的原因正是它简化了整个代码。

当然,不熟悉元编程的程序员在阅读或维护代码时会遇到麻烦,但这不仅仅是反对与不了解代码的程序员合作的一个论点吗?

不了解for-loop wil的程序员也发现难以阅读。

答案 2 :(得分:2)

在整个标准库中以特征的形式使用相当简单的元编程。标准库似乎很受欢迎,所以我认为我们可以说元编程在那里很有用。

答案 3 :(得分:1)

我确实遇到过这样一种情况:我必须解决一个不太大的系统,该系统大量使用模板元编程(特别是静态多态,SFINAE和其他技术)。我可以告诉你,这将使开发人员更难。如果使用模板元编程很多,那么每个开发人员都必须熟悉这些技术,否则他们将无法高效地工作。

另一方面,模板的一些使用非常容易理解和使用。例如通用容器(矢量),智能指针......

答案 4 :(得分:0)

与往常一样,您需要平衡利弊。如果您关心性能(模板元编程还有其他用途),您应首先证明使用模板元编程技术可以获得显着且重要的性能提升。 (甚至可以通过过度使用模板来阻止编译器运行速度慢的程序,所以总是要测量!)

C ++模板最初并不是为元编程设计的,所以即使是使用元编程解决的相对简单的问题,也会产生难以理解的代码,尤其是那些不熟悉常见模板元编程技术的人(因为它们通常不是非常直观的)。另外,根据您的特定问题,您可能会考虑代码生成与模板元编程。

答案 5 :(得分:0)

这取决于您与谁合作,以及他们喜欢和熟悉的内容。在没有任何信息的情况下,我建议为新项目提出以下具体的无争议(而非非常......)模板“事物”清单:

  • 手写智能指针,适用于您的应用使用的各种内容
  • STL容器
  • static assert

而且,仅限高级用户:

  • 用于一些明显的标准应用程序的特征(脚本语言绑定和序列化可以想到)

这可能有点保守,但似乎很容易让所有人相信这些东西的价值。如果把它们放在一起,它们不会膨胀编译时间,并且大多数情况下与常用的代码浏览工具相当好。大多数模板都不应该解释太多,即使对那些不太了解模板的C ++程序员来说也是如此。

(关于boost,以及它尚未合并的任何其他模板库,目前许多(大多数?)C ++程序员的标准看起来相当冒险。所以我觉得谨慎避免它现在。)