在C++中声明函数模板一直是冗长的。C++ 20增加了一种新的方式,它更简洁,更符合LAMBDAS:缩写函数模板。这个简短的帖子将展示如何使用这个语法,以及它如何应用于C++ 20概念。
C++ 11引入了lambdas,它看起来像:
[captures] (type_1 param_1, type_2 param_2) { body(param_1, param_2); }
您只能使用的参数调用此lambdas type_1
和 type_2
. 但是,我们经常在类型很难完整拼写的情况下使用lambda(特别是在使用诸如 范围 ). C++ 14允许您使用任何类型的参数来调用lambdas。 auto
关键字:
[captures] (auto param_1, auto param_2) { body(param_1, param_2); }
现在可以传递任何类型作为参数。C++ 20的缩写函数模板允许您将这种语法应用到函数模板。
在C++ 17中,你可以写一个函数来给动物头部划痕作为函数模板,所以它可以用任何类型的动物来调用:
template <class Animal> void give_head_scratches (Animal const& the_animal);
在C++ 20中,可以简化使用 auto
:
void give_head_scratches (auto const& the_animal);
这个版本不太冗长,需要更少的名字,并且更符合C++ 14的lambdas。
不过,上面的函数模板有一个问题:根据声明,我们可以将任何内容传递给它。我们可以很高兴地打这样的电话:
give_head_scratches(42); give_head_scratches(a_cactus); give_head_scratches(blog_post); give_head_scratches(the_platonic_ideal_of_a_chair);
它们可能编译并执行一些奇怪的操作,或者由于模板的实现执行了这些类型不支持的操作而导致无法编译。理想情况下,我们希望用它所支持的类型来记录这个函数模板的接口,并且让编译器能够在用不兼容的类型实例化声明时给出详细的错误。
C++ 20给我们 概念 帮助解决这个问题。如果我们有一些 animal
定义了一个表示动物的类型应该有什么接口的概念,然后我们可以这样使用它:
template <animal Animal> void give_head_scratches (Animal const& the_animal);
这是相当冗长和重复的。理想情况下,我们可以在函数参数列表中直接使用概念名称,如下所示:
void give_head_scratches (animal const& the_animal);
但是,这个语法被标准化拒绝了,因为如果不知道它是一个函数模板还是一个常规函数,就无法判断它是一个函数模板还是一个常规函数 animal
是一种类型或概念。
幸运的是,C++中包含了这个语法的版本20,它使用 auto
再次输入关键字:
void give_head_scratches (animal auto const& the_animal);
这会检查被替代的东西 auto
满足 animal
概念。如果我们用一个 kitten
然后 animal<kitten>
将进行检查。这使我们返回了简洁的语法,同时也允许我们约束模板声明。
自年以来,MSVC一直支持约束自动 Visual Studio 2019版本16.8, 最近,缩写函数模板被添加到 版本16.9预览版3 . 我们鼓励您下载这些工具并尝试一下实现!我们可以通过下面的评论或电子邮件联系我们(visualcpp@microsoft.com). 如果你发现任何问题,你可以使用 报告问题 工具或直接访问 Visual Studio开发人员社区 . 你也可以在Twitter上找到我们 @视觉 .