问题标签 [c++-concepts]
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++ - C++ 约束 enable_if 与需要
我刚刚运行了 C++ requires关键字,想知道到目前为止我的理解是否正确:requires和enable_if都为模板提供编译时间约束。如果需要约束将被包括在内。
其中requires提供了一种约束函数参数的方法,enable_if的主要目的是将编译时转换限制为模板类型本身的某些条件。
例子:
在这里,当且仅当 pA 和 pB 可以添加时,该概念才有效,而 enable_if 条件将评估限制为整数类型。
感谢您让我知道我是否做对了!
PS:我还不太确定require约束的语法,这似乎有所不同。另外,暂时不知道哪个编译器接受它们,所以感谢任何提示!
c++ - 为什么在生成的模板中重复了一个特定的概念约束?
我刚刚开始使用 g++ 6.1.0(Debian 软件包版本 6.1.1-1,flags -std=c++17 -fconcepts
)尝试 C++ 概念,并且在以下简化示例中遇到了我不理解的错误消息:
在此代码中,版本 1 和版本 2 都成功编译并具有预期的运行时结果。但是,对于版本 3,我收到以下错误消息:
从错误消息来看,由于某种原因,它似乎在生成的模板中生成了 InputIterator 和 InputPredicate 模板参数的重复版本。我不明白为什么会这样,特别是考虑到版本 2 有效。我是否误解了 cppreference.com 的声明:“由等效约束类型说明符引入的所有占位符都具有相同的发明模板参数”?或者这可能是 gcc 中的错误?
c++ - 使用 SFINAE、约束或概念限制专业化?
以下程序运行良好:
重要的是在编译时显式声明结构 B 和 C,并且只允许那些对应用程序有意义的特化。
但是从上面的代码中可以看出,我的下游开发人员(总有一天!)有可能创建语法上正确但语义上没有意义的模式。具体来说,应用程序只知道如何使用类和函数类型相同的类型。其余的都是无稽之谈。
这似乎是 SFINAE、约束或概念等新 C++17+ 功能之一的案例。尽管我正在阅读这些内容,但我还没有判断力做出选择。在 Alternatives 下的 cppreference 中,如果编译器有能力(我使用 VS2015),他们建议使用 Concepts 而不是 SFINAE。
将类型名 J 限制为与类型名 U 相同的好方法是什么?
c++ - 需要约束模板成员函数的概念定义
注意:以下所有内容都使用 GCC 6.1 中的 Concepts TS 实现
假设我有一个概念Surface
,如下所示:
现在我想定义另一个概念,Drawable
它匹配任何类型的成员函数:
IE
也就是说,aDrawable
是具有模板化 const 成员函数draw()
的东西,它采用左值引用来满足Surface
要求的东西。这很容易用文字来指定,但我不太清楚如何使用 Concepts TS 在 C++ 中做到这一点。“明显”的语法不起作用:
错误:此上下文中不允许使用“auto”参数
添加第二个模板参数允许编译概念定义,但是:
模板参数推导/替换失败:无法推导模板参数“S”
现在我们只能检查特定的 < Drawable
, Surface
>对是否与概念匹配Drawable
,这不太正确。(一个类型D
要么具有所需的成员函数,要么没有:这不取决于Surface
我们检查的具体内容。)
我确信有可能做我所追求的,但我无法弄清楚语法,而且网上还没有太多的例子。有人知道如何编写需要类型具有约束模板成员函数的概念定义吗?
c++ - 用概念重新实现 STL
最近 gcc 实现了对 C++17 标准的实验性支持,其中一部分是概念。我读到它并立即迷上了它可以提供的所有好东西。但我的问题是——当前的 STL 实施是否会使用概念进行改造?是这样,有一些关于什么时候的估计吗?
从我的角度来看,如果至少algorithm
使用概念重新实现集合以避免在缺少运算符或其他内容时出现不必要的长错误消息,那将是很棒的。
编辑: 显然我把概念作为 C++17 的一部分弄错了。无论如何,关于 STL 升级概念的问题我相信仍然有效。
c++ - 使用 GCC 6.1 检测概念 TS
如何使用 GCC 6.1 检测 Concepts TS 的存在?
此页面建议__cpp_experimental_concepts
应在支持概念 TS 的实现中预定义宏。但是,以下测试程序在带有-fconcepts
标志的 GCC 6.1 上编译没有错误:
(我希望要么static_assert
触发,要么concept
关键字无法识别。)
有谁知道根据概念是否可用有条件地编译代码的任何其他方法?
c++ - 我可以编写一个自定义分配器来决定 std::vector 的重新分配量吗?
据我了解,自定义分配器必须符合分配器概念的要求。但是,基于该界面,当向量用完储备时,我看不到如何选择新的分配量。
例如,我机器上的当前实现每次reserve
在push_back()
. 我想提供一个缓慢且具有内存意识的自定义分配器。它只会分配以前capacity+1
的元素来容纳新元素。
这些是我正在查看的概念的接口:
我制作了一个像这样的工作样板分配器:
看allocate
功能:
我可以在这里分配更多或更少的内存,但我没有看到一种将其报告回向量的方法,以便它知道它的当前容量是多少。
也许这超出了分配器的责任范围?
c++ - 如何为以模板类作为参数的函子定义概念?
我正在编写一个数值模拟程序。我的一个函数需要回调。该函数作为模板函数实现,回调作为模板类实现,因此可以内联对回调的调用。
现在,我的函数变得越来越复杂,我想以一种定义明确、可自动检查的方式声明回调的签名。所以我查看了 C++ Concepts TS。
这就是问题所在。我想定义一个仿函数的概念std::array
,例如
注意:这是一个简化的示例。更改函子的签名(例如,更改std::array
为一对迭代器)并非不可能,但不是首选。
怎么写一个概念来表示sum
和avg
上面的通用接口?
首先我试过:
但这会导致(在我看来)一个丑陋的代码;在使用回调的模板函数的定义中,其声明如下所示:
该<double, 1>
部件是编译通过所需的虚拟部件。这种解决方案很难接受,因为模板参数callback.operator()
可能会在内部发生变化simulate
;可以将不同类型和大小的std::array
s 传递给它。
其次我试过:
此代码格式错误,因为在 requires-expression 中使用 constrained-type-specifier 格式错误(参考:https ://groups.google.com/a/isocpp.org/forum/m/#!topic/concepts /_gHn0wJJNGA)。顺便说一句,gcc 6.1.0 会产生一个内部编译错误。
所以,问题是:如何为以模板类作为参数的仿函数定义一个概念(最好没有变通方法)?
通过我的搜索,我得到的印象是 C++ 概念可能不是为这样的用途而设计的。也非常感谢对 C++ 概念的替代方案的建议。
(可能与使用 Concepts Lite 为具有成员函数模板的类型指定概念有关,但我不知道它是否重复)