在C ++中,是SFINAE和元编程是故意的,还是模板的副产品?


11

SFINAEtemplate元编程可以做出色的事情,许多库也大量使用它们。

历史上,这两个“魔术概念”都是在C ++中有意引入/支持的。还是后来才发现它们是原始template编程的有用副产品(副产品)?

Answers:


19

大约10年前的会议日之后,我碰巧与Erwin Unruh和其他一些人一起在一家酒吧里,我问他关于VJovic提到的节目。到那时,我们已经喝了几杯啤酒,这是一次非正式的聚会,它已经在我的脑海中生活了十年,所以请带着一点盐来服用,但是根据我的记忆:

他说,他们已经添加了模板功能,以便更好地为STL服务。据他说,委员会中的许多人认为他们在创造某些东西时并不了解其全部功能。他本人怀疑所有模板内容(尤其是部分专业化内容)都构成了图灵完备的语言,并且他始终打算对此进行形式化证明,但始终没有这样做。

取而代之的是,在一个标准化会议的一个晚上,他想到了一个程序,程序将质数打印为错误消息此处应与现代编译器一起使用的版本),该程序是编译过程中计算出的。作为模板元程序,按今天的标准来看并不是很令人印象深刻,但毕竟这是第一个。有人正式提交了该程序,从而使他认为是个笑话,因此该程序成为了官方的ISO标准化文件。

我记得我曾特别问过他关于Bjarne Stroustrup对程序的反应,而对此,欧文以双手遮住眼睛的方式模仿了他。 :)

事后看来,我很遗憾没有询问托德·韦德赫伊曾(Todd Veldhuizen)(他也是那个会议的代表)如何提出表达模板。(他当然是一个很好的交谈对象。)但是我比他小得多,所以让一生的机会流失了。:(


+1,有趣的经历。那时他们有没有谈论SFINAE?
iammilind 2011年

@iammilind:我认为SFINAE只是他提到的为更好地支持STL而添加的功能之一,尽管“ SFINAE”这个名字只是在此后几年才创造出来的。
2011年

11

1994年,在c ++标准化委员会的一次会议上,E。Unruh发现了可以在编译时使用模板来计算某些东西。他编写了一个打印质数的程序。此练习的有趣之处在于,质数的产生是由编译器在编译过程中而不是在运行时执行的。尽管该程序不是完全可移植的,但该程序确实表明模板实例化机制是一种原始递归语言,可以在编译时执行非平凡的计算。

此摘录摘自Vandevoorde和Josuttis的“ c ++模板”(第17章)。

如您所见,它是很早就被发现的,它的力量被立即发现。


2
好一个 我也在互联网上阅读过这种文章,不记得来源。SFINAE也是如此吗?
iammilind 2011年

@iammilind您的意思是“ SFINAE也是如此吗?”
2011年

1
SFINAE通常需要编译器的一些支持。因此,可能不是偶然发现的。
iammilind 2011年

@iammilind我发现有从书中类似的文本的InformIT的的文章:informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@iammilind编辑答案。我会说这是偶然的,因为编译器对模板的支持是有限的。该方案是不可移植的,我认为这只是一个编译器的工作
BЈовић
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.