元宵三五,夜雪初霁,蕙风透寒。 乘暇再更一个 C++26 的小特性,动机简单,看一下小例子: using Point3D = std::tuple<float, float, float>; int main() { auto [x, y, z] = Point3D(1, 2, 3); return x; } y 和 z 皆未使用,可仍旧要起一个名称,实显多余。新特性允许使用 _ 作为占位符,忽略不关心的值。是以可以这样写: using Point3D = std::tuple<float, float, float>; int main() { auto [x, _, _] = Point3D(1, 2, 3); return x; }… Continue Reading C++26’s Placeholder variables with no name

目前进入 C++26 的特性当中,Pack Indexing 是较为有用的一个,值得谈谈。 发展背景 早期,C++ 元编程是摸着石头过河,许多特性只是当时情况下的权宜之计,并非最理想的解决方式。纵然非常巧妙,却也治标不治本,诸多简单功能,写来亦是繁琐不已。 扬汤止沸,莫若去薪。不断向下一阶段发展的元编程,就是要彻底解决早期妥协所留下的问题,提供最优雅的解决方式,摆脱奇技淫巧带来的复杂性。 Pack Indexing 就是在这种背景下所诞生的一个新特性,提了多年,终于进入 C++26。 在此之前,C++ 就有一些与参数包相关的增强特性,比如 C++17 Fold expressions 和 Using-declarations,C++20 Lambda capture,还有原本打算进入 C++23 却一直悬而未决的 Expansion statements(最近被人重拾,兴许会入 C++26)。 此间,也有一些处于发展中的其他特性,比如 Pack declarations、Pack slicing 和 Pack literals,Pack Indexing 就是其中之一,它最先进了标准。 新的索引式访问方式 当前,若要定义一个参数包变量,我们需要借助 std::tuple;若要索引式访问参数包元素,需要借助 std::get 和 std::tuple_element;若要解包,需要借助 std::apply。 而借助这些新的特性,以后可以直接写出这样的代码: template <typename… Ts> class Tuple {… Continue Reading C++26 Pack Indexing

岁月如驰,距前篇反射文章,已近两载。 C++23 工作殆尽,C++26 紧随其后,Relection 也有了一些新进展,本篇来看这些更新的些许内容。 相关作者 知识似树,发枝散叶,往往只需两三人而已。欲了解一个领域,先知悉其中的几位关键人物,由此扩散挖掘,便可以快速理解该领域 80% 以上的内容。 是以本节介绍一下 SG7 中 Reflection 相关的研究人员。 先从 Wyatt Childers 说起,他是 Lock3 Software 的软件工程师,主要就是研究实现静态反射和元编程。lock3 版本的反射就是他们写的,在 C++ 反射 第四章 标准 中便是使用的这一版本进行示例编写。 而 Lock3 Software 公司的创始人是 Andrew Sutton,此人就是 C++20 Concepts 提案的作者,也是 GCC Concepts 的主要开发人员。他于 2010-2013 年间曾以博士后研究员的身份加入 TAMU(Texas A&M University),而 Bjarne Stroustrup 于 2002-2014 年间在 TAMU… Continue Reading Reflection for C++26