问题标签 [c++20]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何将一个模块拆分为多个文件
我阅读了 C++ 中的模块,但有些东西我真的不明白该怎么做。我想知道如何使用当前的合并模块提案有效地将 c++ 模块拆分为多个文件。
假设我有两个要导出的类。我想拆分我的 ixx 文件,以便这些类中的每一个的实现都保留在单独的文件中。
我想象过这样的事情:
接口.ixx:
然后,我想像这样实现我的类,
A.ixx:
B.ixx
我想知道的是:无论文件如何,模块是否都知道它的接口?如果没有,是否有另一种方法将模块拆分为多个文件?我知道在这种情况下可能看起来很傻,但是在大型模块中使用大型类,将事物分开是很诱人的。
c++ - 使用 C++ 模块时,是否有任何理由将函数声明(.hpp 文件)与其定义(.cpp 文件)分开?
我习惯于编写没有模块的代码,其中头文件包含函数声明,例如:
并且相应的 .cpp 文件包含定义:
据我所知,这样做是为了减少编译时间和减少依赖。什么时候使用模块,这仍然适用吗?将类与 Java 和 C# 的定义方式放在一个文件中是否一样快?如果是这种情况,使用模块时是否需要.hpp
和文件?.cpp
c++ - 模块 TS 和纯虚拟类
问题
我正在尝试使用我在另一个模块中定义的纯虚拟类,但是在尝试使用它时遇到以下问题:base class undefined
奖金信息
在我确定问题所在的搜索过程中,我发现命名空间本身也遇到了类似的问题
编译器
我目前正在使用VC++
具有以下附加设置的编译器:
/std:c++latest /experimental:module /module:exportActiveMacros
我通过 IDE 项目设置进行的
代码
至于代码,它如下所示:
Foo.ixx
另一个人.ixx
c++ - C++ TS 概念和访问器
我想使用 Concepts TS 来帮助我进行数据约束。我将讨论p0121r0中讨论的概念,并且我使用 GCC 6.2 进行测试。
看这段简单的代码:
我必须将具有test属性的类型传递给 struct Tester ,该类型是可递增和可递减的。好的。
按预期工作。显然,下面的一个是行不通的:
现在,真正的问题是:为什么以下一个不起作用?
我试图深入研究标准论文,但我无法理解这种行为是预期的,如果标准本身缺少这种可能性,如果编译器无法正常工作......
或者,也许我需要声明一种友谊,但这有什么意义呢?在这种情况下,概念约束不需要受到访问者的约束......
对这里发生的事情有任何想法吗?
编辑: 用一个简单的例子来说明问题的想法并不总是那么容易。这个有点复杂,但更类似于真实案例:
如您所见,很明显counter、load和unload必须是私有的/受保护的,并且它们只能从Scop访问。如果我使用抽象基类,我只能约束counter和unload,但不能load(如您所见,我不知道如何处理正确的语法......)。
也许这不会改变你的答案,但问题可能更清晰一些。
c++ - C++ 中的模块和内联
当模块进入 C++ 时,我对一件事感到好奇。之前有头文件和 .cpp 文件。.cpp 函数不能内联。
这是我的问题。据我所知,内联语义不会改变,但是,如果我实现(不是内联)一个函数:
在这种情况下,优化器是否能够内联该函数,因为该函数仍然在同一个模块中实现?据我所知,在它不可能之前,因为它进入了一个专用的实现文件。
c++ - 带有概念的 C++ 别名模板(typedef)?
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4553.pdf
gcc6:-fconcepts
有什么方法可以声明Str
为const String&
?
c++ - 是否可以确保在编译时最多调用一次 constexpr 函数?
正如标题所问:是否可以确保在编译时最多调用一次 constexpr 函数?
如果函数不是 constepxr,这显然是不可能的;我可以编写一个在我按下空格键时调用的函数,因此编译器在编译时永远无法解决这个问题。
c++ - 连续迭代器检测
C++17 引入了 ContiguousIterator http://en.cppreference.com/w/cpp/iterator的概念。然而,似乎并没有计划让contiguous_iterator_tag
(以我们现在的方式random_access_iterator_tag
)报告std::iterator_traits<It>::iterator_category
。
为什么contiguous_iterator_tag
失踪?
是否有传统的协议来确定迭代器是否是连续的?还是编译时测试?
过去我提到,对于容器,如果有一个.data()
成员可以转换为::value
类型指针,并且有.size()
成员可以转换为指针差异,那么应该假设容器是连续的,但我无法提取迭代器的类似特性.
一种解决方案可能是还具有data
用于连续迭代器的功能。
当然 Contiguous 概念适用&(it[n]) == (&(*it)) + n
于 , for all n
,但这不能在编译时检查。
编辑:我发现这个视频将其置于更广泛的 C++ 概念背景中。CppCon 2016: Patrick Niedzielski撰写的“在现代多核世界中构建和扩展迭代器层次结构” 。该解决方案使用概念(Lite),但最终的想法是连续迭代器应该实现一个pointer_from
函数(与我的data(...)
函数相同)。
结论是概念将有助于将理论形式化,但它们并不是魔法,因为某人、某处将在连续的迭代器上定义新的特别命名的函数。该演讲概括为分段迭代器(具有相应的函数segment
和local
),不幸的是它没有提及跨步指针。
编辑 2020:
现在标准有
c++ - 如何不使用`export`关键字从模块中导出函数和类?
我正在研究在我的宠物项目中使用 C++ Modules TS 的机会。对我来说,重要的用例之一是包装遗留标头。
假设我有一个包含一些函数和类的头文件std.io.ixx:
根据这篇文章,我使用以下命令编译模块:
这给了我一个新文件std.io.ifc
。然后我在另一个源文件main.cxx中使用这个模块:
使用以下命令编译:
编译给了我以下错误:
因此,正如我们所见,模块中的标识符没有被导出。export
我可以通过在要导出的每个标识符之前手动添加关键字来解决此问题,但这对于包装遗留标头的用例是不可能的。
我做错了什么?如何从标头中导出所有可能的标识符?
c++ - C++20 中的协程是什么?
c++20中的协程是什么?
它与“Parallelism2”或/和“Concurrency2”有什么不同(看下图)?
下图来自 ISOCPP。