T240725 说到,Unnamed namespaces 有一个唯一的名称会通过 using-directives 自动导入,倘若可以手动指定这个名称,就是 inline namespaces 了。此时,自动导入的名称就是 inline namespace 的名称,比如 std::literals 和 std::liternals::chrono_literals 的实现: #if __cplusplus >= 202002L inline namespace literals { inline namespace chrono_literals { /// @addtogroup chrono /// @{ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wliteral-suffix" /// Literal suffix for creating chrono::day objects. ///… Continue Reading T240730 inline namespace

Unnamed namespaces,也叫 Anonymous namespaces,是命名空间的一种特殊形式。这种形式可以省略命名空间的名称,如: namespace { /* .. . */ } 在语义上与等价于: namespace unique_name { /* … */ } using namespace unique_name; 编译器会自动生成一个唯一的名称,并使用 using-directives 自动导入名称。 与其他形式的命名空间不同,Unnamed namespaces 的链接方式是 Internal Linkage,标准描述为: An unnamed namespace or a namespace declared directly or indirectly within an unnamed namespace has internal linkage. All other namespaces… Continue Reading T240725 Unnamed namespaces

前言 模板编程,技巧如云,妙艺似雨。第五章滔滔滚滚地讲述了模板的核心概念和常用技术,篇幅稍长,诸般妙诀,未遑悉录,放于本章。 闲话不题,本章尽是一些巧妙的实践,于极尽模板产生式编程大有用处,难度不低,重要重要! 本章代码非是示例,而是 GMP 库的真实代码。 Type List Type List 是个只装类型的容器,不含任何数据、函数或类型成员,定义相当简单。代码如下: template<typename…> struct type_list {}; 可变模板参数是实现的核心,表示 Type List 中存入的类型。类型并无一致性要求,是以 Type List 本身还是个异构容器。为何需要这种容器?只因编译期可能需要对很多类型操作,借助这种容器,能够方便地保存各种各样的类型。 可是就一行代码,也没见能进行什么操作呀?其实,Type List 只是个类型容器,需要配套算法才能发挥作用,这些算法才是关键。算法可以分成如下几类: 容积(Capacity) 大小(type_list_size_v) 判空(type_list_empty) 元素访问(Element access) 索引访问(type_list_element_t) 前向类型(type_list_front) 后向类型(type_list_back) 尾部类型(type_list_tail) 内含检测(type_list_contains_v) 元素操作(Element manipulation) 合并(type_list_concat_t) 移除(type_list_remove_t) 前向移除(type_list_pop_front) 后向移除(type_list_pop_back) 插入(type_list_insert_t) 前向插入(type_list_push_front) 后向插入(type_list_push_back) 反转(type_list_reverse_t) 去重(type_list_unique_t) 过滤(type_list_filter_t) 搭配以上这些基础算法,Type List 方得显现妙用。以下各个小节,便来展示各个算法的实现,这些实现并不一定是最优的,但却能展示模板技巧。GMP… Continue Reading 《产生式元编程》第六章 感今朝妙艺几人知