C++20 模块导出模板实例化

2024-03-26

我正在创建一个库,并且 C++20 模块内有一个类模板,我想添加一个实例化,以减少使用我的库的每个项目的编译时间。

这些不同的实现是否等效,或者是否有更好的方法来实现?

1)

//mod.cpp
export module mod;

export template<typename T>
struct mystruct{ T i;};

export template class mystruct<int>;
//mod.cpp
export module mod;

export template<typename T>
struct mystruct{ T i;};

template class mystruct<int>;
//mod.cpp
export module mod;

export template<typename T>
struct mystruct{ T i;};

export extern template class mystruct<int>;



//mod_impl.cpp
module mod;

template class mystruct<int>;

Edit: 这个答案 https://stackoverflow.com/questions/61520847/how-to-use-template-explicit-instantiation-with-c20-modules只说 2. 有效,但我的观点是 1. 和 3. 是否也等于 2.


模块影响两件事:名称的范围和声明的可达性。仅当它们位于模块的权限范围内时(即:在导入的模块接口 TU 中并且不在全局模块片段中),这两者才重要。

在模块权限内声明的名称只有在以下情况下才可以在该模块外部使用:export由该模块编辑。在显式模板实例化的情况下,模板itself已导出,因此模块外部的用户已经可以使用该名称。

然而,显式模板实例化定义也是一种声明。模块控制声明的可达性。事情是,声明的可达性规则 https://timsong-cpp.github.io/cppwp/n4861/module.reach#3实际上并不care about export:

如果对于实例化上下文([module.context])中的任何点 P,声明 D 是可达的,

  • 在同一翻译单元中,D 出现在 P 之前,或者
  • D 不会被丢弃([module.global.frag]),出现在可从 P 到达的翻译单元中,并且不会出现在私有模块片段中。

[注:声明是否导出没有轴承关于是否可达。 ——尾注]

添加了强调。

这些规则只关心哪些 TU 已被导入(以及声明是否在全局/私有模块片段中)。

因此,如果主模板声明是exported,显式模板实例化(即not在导入的模块文件之一中的全局/私有模块片段中)可由导入它的任何代码访问。

所以如果你也没关系export显式模板实例化。如果主模板已经exported,它的名称已经可以使用,所以唯一重要的是显式模板实例化是否可见。

所以你的 #1 和 2 在功能上是等效的。并且最好不要export一些你不需要的东西。


至于行为extern template, 那很有意思。

While extern规范化表示外部链接,这不适用于extern template。所以我们不存在链接问题。并且自从extern template模块的导入者可以访问声明(如前所述),他们会看到它并尊重它。

所以唯一的问题是是否明确定义在你的“mod_impl.cpp”中也是可以访问的。但这不是一个问题,因为只有宣言定义的一部分永远是“可达的”。也就是说,可达性仅对声明重要。

显式实例化定义位于不同的 TU 中。因此,它只会在该 TU 中实例化;导入模块的代码仅到达声明。因此,它不会实例化模板。

所以是的,你可以执行extern template体操(尽管如此,export没关系)。但这与将显式实例化放入模块接口中没有什么不同,而且这样做更干净。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++20 模块导出模板实例化 的相关文章

随机推荐

  • Swift:一个数组中的不同对象?

    一个数组中是否可以有两个不同的自定义对象 我想在一个中显示两个不同的对象UITableView我认为最简单的方法是将所有对象放在一个数组中 根据您想要对数组进行多少控制 您可以创建两种对象类型都实现的协议 该协议不需要包含任何内容 可能是
  • 当拥有 @objcMembers 私有动态变量时 @objc 冗余?

    因此 我将 Realm 与 Swift 结合使用 并使用 objcMembers 关键字标记我的类 但是当我尝试创建一些私有变量时 Xcode 强制我在这些私有变量旁边添加 objc 这是有意的行为吗 看来这对我来说是多余的 objcMem
  • deepcopy 不尊重元类

    我有一堂课 根据设计 必须遵循单例图案 所以我继续使用元类 一切都运行良好 直到报告了一个错误 总而言之 deepcopy ied 我的实例单例类不是相同的实例 我可以通过从基础继承来解决这个错误单例 type 类 但我宁愿不这样做 原因在
  • 我如何确保 Spring roo 生成的方面是由依赖项目编织的?

    我有一个春天Roo多模块项目 我注意到在另一个项目中包含包含我的域模型的 jar 模块后 各个方面还没有被编织给我留下了没有任何可用的 getter setter 的域类 如何确保 Spring roo 生成的切面是由依赖项目编织的 EDI
  • 如何在没有 Windows iTunes 的情况下在 iPhone 上安装 IPA [已关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 在没有 Mac 或不使用 iTunes 的情况下 如何在 iPhone 上安装 iPhone 应用程序 IPA 另外 如果这还不够困难
  • Qt 程序挂起(无响应)直到函数结束然后再次开始工作

    我在 Qt 中有一个 UI 应用程序 有几个函数可以运行大规模 SQL 查询 返回数千个结果 当单击运行此查询的按钮时 UI 窗口立即变为 无响应 但是我可以从控制台输出中看到 所有内容实际上仍在后台运行 一旦函数结束 数据就会按预期显示
  • mvc4 中没有为此对象定义无参数构造函数

    using Michell ClaimsAuditAdmin Models using Mitchell ClaimsAuditAdmin Repositories using Mitchell ClaimsAuditAdmin Web M
  • 为什么 sys.exit() 会导致回溯?

    根据如何在不回溯的情况下退出Python https stackoverflow com q 1187970 3357935 呼叫sys exit 在 Python 脚本中应该静默退出而不进行回溯 import sys sys exit 0
  • 面向 Android 12 及更高版本的应用需要为“android:exported”指定显式值 [Cordova]

    当我在 GitHub 中运行 Apk 时 出现错误 当我在 GitHub 中构建 Apk 时 无法定义清单内的某些内容 因为它每次都是新鲜构建的 我所能做的就是在 Config Xml 文件中 添加后android exported fal
  • 在 Android Edittext 中设置特定文本的文本颜色

    如果用户键入一个字符串并且它包含 我想将文本的颜色更改为红色 我尝试过使用 textwatcher 但出现堆栈溢出错误 我只想在 开头时更改颜色 代码如下 topic addTextChangedListener new TextWatch
  • 可重入锁用例

    我对Java的多线程概念很差 我正在了解 ReentrantLock 的功能和用法 我发现它比同步更灵活 并且添加了更多功能 我可以看到上面提到的例子并且我很好地理解了 我无法弄清楚它到底对业务有何帮助的实时场景 我认为最好避免僵局 有人可
  • 对话框中的 Xtext DSL 嵌入式编辑器

    我是 xtext 的新手 我已经使用 xtext 创建了 DSL 并且生成了工件 这生成了具有许多功能 如内容辅助和语法着色 的编辑器 现在的问题是我想将编辑器嵌入到对话框中 为了实现此目的 我使用嵌入式编辑器 我能够获取嵌入式编辑器并将其
  • C++ 父类对齐

    是否可以指定父类的对齐方式 例如类似的东西 未编译 template
  • 检查是否已经是用户然后插入数据库 php

    如果我想插入数据库 我的代码可以工作 但是我检查用户是否已经存在不起作用 我认为这个想法是检查该用户名是否已经存在一行 如果是 则不要将该用户添加到数据库中 否则 email POST email password password has
  • 全局应用程序中的个人名称:存储什么[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Storing 个人姓名 http en wikipedia org wiki Personal name对于来自许多不同国家的用户使
  • 软件包“pecl.php.net/intl”没有可用的版本

    我正在尝试为 php 安装 intl 当我跑步时sudo pecl install intl它给了我一个错误No releases available for package pecl php net intl 我尝试过清除缓存 也尝试过升
  • 使用 bash 从文本文件中读取字符

    有谁知道如何使用 bash 脚本从文件中读取前两个字符 有问题的文件实际上是一个 I O 驱动程序 其中没有换行符 并且实际上无限长 The read内置支持 n范围 echo Two chars while read n 2 i do e
  • 从 Web 项目中排除 node_modules 目录

    如果我右键单击我的项目并选择 发布 Web 项目 我将收到有关目录名称长度的错误 我已经追踪到了node modules 我想从进程中排除该目录及其内容 我们使用一个 pubxml文件 我尝试添加以下内容之一或以下内容的组合
  • 强制渲染已计算的反应元素

    我正在尝试构建一个闪亮的应用程序 通过不同的 render 函数输出多个结果 问题是其中一个结果需要一些时间来计算 所以我希望shiny能够尽快渲染出快速的结果 这是一些代码来说明 ui R library shiny shinyUI fl
  • C++20 模块导出模板实例化

    我正在创建一个库 并且 C 20 模块内有一个类模板 我想添加一个实例化 以减少使用我的库的每个项目的编译时间 这些不同的实现是否等效 或者是否有更好的方法来实现 1 mod cpp export module mod export tem