程序员是否需要了解C++元模板?

3
根据我的经验,元模板(Meta-templates)非常有趣(当你的编译器兼容时),可以提高性能,幸运的是我周围有经验丰富的C++程序员,他们也理解元模板,然而偶尔会有新的开发人员加入,无法理解我们使用的一些元模板技巧(主要是Andrei Alenxandrescu的东西),需要几周时间才能得到适当的启蒙。
所以我想知道其他C++程序员的情况如何?元模板编程是否应该成为C++程序员“必备”知识(当然不包括入门级学生),还是不需要?
编辑:请注意,我的问题与生产代码有关,而不是小样本或原型。

是我看错了,还是问题标题和实际问题不一样? - wilhelmtell
既然你提到了,你是对的,这个问题不匹配。所以我改成更符合问题内容的形式。 - Robert Gould
1
“meta template”是什么?难道你的意思是模板元编程吗? - sellibitze
8个回答

7
如果你能够找到足够了解模板元编程的候选人,那么请务必要求他们掌握。但是,这样做可能会让很多合格且有潜力的人离开(不知道如何使用该技术并非没有正当理由,其中一些原因是如果在很多平台上使用它,你将创建无法编译的代码或者普通开发人员难以理解)。模板元编程很棒,但让我们面对现实,它正在推动C++的极限。 现在,候选人应该至少了解基础知识(在编译时计算n!,或者至少如果他们看到代码可以解释其工作原理)。如果你的新开发人员在几周内可靠地变得高效,那么你当前的招聘工作可能相当不错。

4

是的,但我个人不会将其放在高优先级位置。这是一个漂亮的功能,但它有点情境化,良好的C++代码可以在没有它的情况下开发。我个人使用过一两次,但并没有真正发现它对于我的工作有足够的价值以便经常使用它。(也许这是由于我缺乏C++生产经验所致)


3

我在生产代码中曾经唯一使用过模板元编程的方法就是将一个关键循环展开,该循环读取了硬件寄存器N次,然后再读取M次,其中N和M是不同的硬件,并已在编译时确定。总体而言,这种技术似乎并不适合我们的代码库,我永远无法通过代码审查。


2

18个月后,这个话题仍然非常相关。我仍然认为模板元编程不是必要的知识,但你需要至少能够阅读和解释基础知识,例如条件语句和奇妙重复的模板模式(循环)。除此之外,只要有几个人能够为其编写良好的接口,那么基本到中级的模板知识就足够了,当然,你的实际情况可能会有所不同。


2
需要吗?像往常一样,这取决于情况。对于我们这些在嵌入式领域中刚刚获得半可用C++编译器的人们来说,我们很高兴能够使用类。然而,如果你有一个相当不错的C++编译器,比如gcc 3.3+,那么是的,你应该考虑模板元编程。当然,一个很好的起点是boost库,因为它涵盖了大多数模板,当STL无法胜任时,你似乎都会寻找它们。它还可以作为一个很好的跳板。然而,有时我发现模板元编程的优点(许多漂亮的类型安全代码,只需要几行<和>)并不值得它所需的代价。有时,一个良好的for( container::const_iterator iter = ... )就可以满足你的需求。

1
作为一个合理(尽管不是广泛)使用模板和元编程的人,我会尽力使接口(指内部使用接口)尽可能正常化。并非每个人都能理解模板,甚至那些能理解的人有时候也不能理解复杂或晦涩的元编程范式。
话虽如此,如果您想深入挖掘并修改我的低层库,您就必须了解相当多的知识。但是,您甚至不必(除了基础知识)理解模板就可以使用它们。这至少是我的底线,也是我对其他开发人员的期望水平(根据他们使用代码的方式)。

是的,这更或多或少描述了我们的做法。我们用友好的最终用户API将我们的代码封装起来,没有<>'s,但我们的核心开发人员需要了解在其背后发生了什么。 - Robert Gould

1

我不认为模板编程是必需的,但了解它肯定是有好处的。你应该对这个主题有足够的了解,以便能够有效地使用诸如STL或Boost之类的模板库。

当我面试某人时,我总会问一些关于模板元编程的问题。如果候选人不知道这个主题,我不会因此而对他们产生不利影响。但如果他们知道,那么这将是一个很大的优势。


-1

了解如何使用C++模板不是绝对必要的。您可以在大多数情况下不使用它们完成大部分操作。但是,它们确实是一个非常棒的特性。

由于您自己创建模板,任何新手都需要像其他代码一样迅速掌握它们,这将成为学习的重中之重。

我鼓励人们学习使用STL的某些功能。我在生产代码中使用过这个库,它确实节省了时间并简化了很多事情。当需要时,我也会自己创建模板。

我也听说过boost库有很多好处。

如果我需要编写可移植的代码,通常会避免使用模板,因为许多编译器仍然无法正确地支持它们。如果需要可移植的STL,则STLPort是最可移植的。


1
我怀疑这个被投票贬低的原因是好的C++代码几乎都需要STL,而且通常还需要各种Boost库。当使用它们时,模板是不可选的,任何现代编译器(甚至是Visual C++,自v6.0之后)都完全支持它们——不需要STLPort。 - Head Geek
1
我闻到了 '同侪压力徽章' 的味道吗? - user287466

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接