为什么只有C++(和D语言)提供可变参数模板功能?可变参数模板好吗?

den*_*631 4 c++ templates programming-languages variadic-templates c++11

为什么只有C++(和D语言)出于支持可变参数模板的许多编程语言?

为该语言提供此功能是否有巨大的好处?

或者底层的复杂性和编译时间的增加(由于类型检查)使得它不值得努力?

我在哪里知道只有C++(和D语言)支持可变参数模板?

维基百科链接:https://en.wikipedia.org/wiki/Variadic_template

The*_*ist 11

C++正在向编译时编程功能发展,因为它提供了C++正在寻找的东西:性能.

使用可变参数模板和C++的所有精彩的type_traits功能,您可以制作非常通用的程序,这些程序在运行时对性能几乎没有影响.一个例子是Armadillo库,它使用模板非常重要地映射到LAPACK的原始C函数,这非常难以使用且容易出错.Armadillo使用精简的C++层同时使其变得非常简单,高性能且类型安全.


Bas*_*tch 10

Common Lisp通过其宏系统提供了比可变参数模板更好的功能(注意,Lisp宏比C++模板或其预处理器的宏功能强大得多).Lisp比C++(和C)早几十年!试试SBCL(一个免费提供的优秀的Common Lisp实现).

顺便说一句,我认为DTerra以及模板Haskell也有类似于可变参数模板的东西,也可能是其他语言......我无法解释为什么Lisp思想消失了,原因更多的是社会学,教育和经济而不是技术; 另阅读SICP,实用Common LispLisp In Small Pieces.

很多(学术大部分)编程语言提供同像性:代码是数据,而数据是代码-并proof-(阅读有关停机问题,哥德尔不完备性定理,柯里-霍华德同构,赖斯的定理,GEB书,局部评价,.. .)阅读有关多阶段编程(类型更安全的元编程形式).在J.Pitrat的博客上阅读CAIA.

在现代的操作系统(例如Linux)的具有动态加载插件(带的dlopendlsym进行),有可能(有时是有趣的)生成一些C(或C++)代码在一些临时文件-即以" 编译到C "(或者生成C++)您的DSL,将其编译为临时插件,并在同一次运行中使用它.

C++模板机制是元编程的一些(不完整)形式.生成C或C++代码(错误地称为源代码生成)和dlopen相应的插件是另一种形式的元编程.您还可以使用JIT编译方法(例如libgccjit,LLVM,libjit,GNU lightning等库)在运行时生成代码.


直觉(关于Common Lisp的宏的功率),在Lisp的宏扩展可以做任意的计算(在表达在Lisp编程语言)的编译时间,而LISP AST S(被称为S-表达 -S)易于加工在Lisp.当然,Lisp中的"编译"过程与C++的过程非常不同(大多数Common Lisp应用程序都包含编译器).因此相当于的rpcgen,的SWIG,的S11N,的柠檬可以很容易地(且常规)被通常见Lisp的宏进行(当然这是不可能在C++中的相同程序).但是你需要阅读几本书来掌握这个强大的想法,所以我并不认为能够轻易解释它