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

时间:2017-11-30 11:04:58

标签: c++ c++11 templates programming-languages variadic-templates

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

为该语言提供此功能是否有一个主要好处?

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

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

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

2 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:10)

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

BTW,我认为DTerra以及Template Haskell也有类似于可变参数模板的东西,也可能是其他语言......我无法解释为何Lisp想法消失了,原因更多的是社会学,教育和经济而不是技术;另请阅读SICPPractical Common LispLisp In Small Pieces

许多(大多数学术上)编程语言提供homoiconicity:代码是数据,数据是代码 - 并且是证明 - (阅读Halting problemGödel incompleteness theorems,{{3} },Curry-Howard correspondenceRice's theorem本书,GEB,...)。另请阅读Partial Evaluation(类型更安全的元编程形式)。阅读J.Pitrat博客上的multi-stage programming

CAIA dynamic loadingpluginsdlopen)的现代操作系统(例如Linux)上,生成一些C是可能的(有时是有趣的) (或C ++)代码在一些临时文件中-ie将dlsym作为“compile to C”(或生成C ++),将其编译为临时插件,并在同一次运行中使用它。

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

直觉(关于Common Lisp宏的强大功能)是Lisp中的宏扩展可以进行任意计算(用相同的 Lisp语言表示)在编译时,LISP libgccjit(称为AST - s)在Lisp中很容易处理。当然,Lisp中的“编译”过程与C ++的过程非常不同(大多数Common Lisp应用程序都包含编译器)。因此,S-expressionsRPCGEN SWIGs11nLemon相当于$match可以很容易地(通常)通过Common Lisp宏完成(当然这是不可能的) 相同程序中的C ++)。但你需要阅读几本书才能掌握这个强大的想法,所以我并不认为能够轻易解释