问题标签 [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.

0 投票
1 回答
1208 浏览

c++ - 为什么 Sortable 概念需要完全有序的值类型,而 std::sort 只需要“小于”可比较?

关于概念 N3701 的最新论文中,算法有以下示例sort

其中Sortable概念定义为

Totally_ordered毫不奇怪,其中被定义为

而反过来又Equality_comparable被定义为

我没有找到 的定义Weakly_ordered,但我相信它应该看起来像这样(对吗?)

底线,在这个定义中,如果我想排序std::vector<T>,我需要 T 提供所有比较运算符<, <=, >, >=, ==, !=。但是,在 C++ 的整个生命周期中,std::sort只需要<提供运算符!这是cppreference所说的std::sort

按升序对范围 [first, last) 中的元素进行排序。不保证保留相等元素的顺序。第一个版本使用 operator< 来比较元素,第二个版本使用给定的比较函数对象 comp。

那么,这是否意味着在未来带有概念的 C++ 中v,类型为std::vector<T>whereT仅提供operator<std::sort(v.begin(), v.end())将编译,而std::sort(v)不会编译?这听起来很疯狂。

我在 Eric Niebler 的当前range-v3 实现中检查了这一点,它就像我描述的那样工作。除非提供所有运算符,否则代码不会编译。

另见相关讨论:https ://github.com/ericniebler/range-v3/issues/271

0 投票
1 回答
208 浏览

c++ - 使用私有成员变量时传递 lambda 是否违反封装?

我写了一个函数来传递给第三方的类。静态函数可以正常工作,直到该函数需要访问私有成员变量才能完成其工作。我可以使用 lambda 表达式来做到这一点(假设它自动或通过转换转换为 std::function )。

例子:

但我真的不明白我在做什么。现在这个其他类正在使用来自不同类的私有成员变量。这不违反封装吗?这是黑客还是我错过/误解了一个概念?

0 投票
4 回答
1583 浏览

c++ - C++模板参数默认函数实现

我有一组用作模板参数的类。它们都符合一些非正式的界面(又名概念)

在这个例子中,假设我用FooorBar作为参数来实例化模板,所以它们必须实现方法a bc.

现在,我有很多这样的类,我希望有一个函数的默认实现,就其他函数而言。

例如,我想默认c返回和之间的差异a()b()所以我希望我定义a()并自动实现就足够了,b()而无需为所有类复制此​​代码。c()int c() { return a()- b();}

我曾经通过多态性来实现这个结果(通过在具有默认(虚拟)实现的基类中定义a()和作为纯虚函数),但出于性能原因,我放弃了这种机制。b()c()

我想知道是否有推荐的解决方案来使用我的模板参数类获得这种结果(即编写一次默认实现)。

0 投票
1 回答
323 浏览

c++ - 约束的部分排序中如何使用折叠表达式?

§14.10.3 N4553 的约束 [temp.constr.order]部分排序指定由概念和逻辑运算符形成的约束表达式应部分排序并用于在重载的情况下选择最佳可行函数。但这是否也适用于使用逻辑运算符折叠表达式的约束表达式?

例如,gcc在此处给出一个模棱两可的重载错误是否正确,或者代码是否有效,打印“c”?

0 投票
2 回答
368 浏览

c++ - C++ 概念和接口之间有什么区别?

我的理解是,C++ 库的概念对于 C++ 来说就像Closeable对 Java 的接口一样(根据链接的源代码,概念是:命名的需求集)。

  1. 这个比喻正确吗?
  2. C++ 接口(即具有纯虚方法的类)和 C++ 库概念之间有什么区别?
  3. 一般来说,通过多重继承实现 C++ 库概念是否等同于在 Java 中实现多个接口(没有多重继承)?
0 投票
1 回答
215 浏览

c++ - 为什么 C++ Concepts TS 中同时存在变量和函数概念?

我一直在查看在 GCC 6 中实现的 C++1z N4377概念 TS 草案,但我不明白拥有两种不同概念的目的:变量概念和函数概念。

功能概念草案的相关部分是[dcl.spec.concept (5.4)]

  • 声明应具有等效于{ return E; }where Eis a constraint-expression (14.10.1.3) 的函数体。

对于可变概念,在下一段 [(6.3)] 中:

  • 初始化程序应该是一个约束表达式

有什么他们中的一个可以做而另一个不能做的吗?如果没有,是否有理由同时包含两者?

注意:最新的草案,P0121R0在这方面没有任何改变

0 投票
1 回答
98 浏览

c++ - 在知道可调用参数之前,如何约束惰性组合?

所以我在玩 GCC6 及其概念实现,我认为 Haskell Prelude 将是一个很好的实验来源。Haskell 的核心特性之一是函数组合,这是我需要立即解决的问题。

尽我所能模仿 Haskell 语法,我写了这个函数:

效果很好,让我可以做以下事情:

很高兴,我决定回去对我的函数组合应用一些约束,但由于它的懒惰,我很快遇到了一个问题。

首先我写了这个概念:

我基于Andrew Sutton 的原始github 项目中的概念。

所以我试图应用到我原来的功能。我遇到的问题是我不知道G返回什么而不知道传递给什么参数,G所以我无法约束G,我不知道F返回什么而不知道它给出了什么参数,我不知道,因为我不知道G返回什么。

我很确定我需要一个Function不关心返回类型的新概念,因为我的组合函数不关心F返回什么,只要它是可调用的。而且我想我可以对内部 lambda 进行约束,即参数类型并更正 G 和 F 但这意味着我可以编写不可组合的函数并且在调用站点之前不会出错。这是可以避免的吗?

也许是这样的:

这是我能做的最好的吗(如果我能做到的话)?

0 投票
1 回答
356 浏览

c++ - C++ 概念:我可以定义一个本身就是模板的概念吗?

对不起,如果问题不是太清楚。我不确定表达它的最佳方式(随意编辑!)。我认为一个例子是最清楚的:

我试图根据Haskell 定义定义一个 Monad 概念。绑定运算符 ( >>=) 要求 aMonad类型A可以绑定到一个接受A并返回 aMonad类型的函数B。我可以A根据value_typetypedef 进行定义,但是如何B在我的概念中定义类型?

在上面的例子中,我用什么来代替_1Function<> 概念中的?

这是否也足以将调用 f 的结果限制为任何类型的 Monad?

0 投票
1 回答
109 浏览

c++ - 声明函数模板的 5 种新语法是什么?

视频指定了当前 TS 版本概念的一些问题,其中之一是:

声明函数模板的 5 种新语法

没有给出例子。所以我的问题是它们是什么?

0 投票
4 回答
114 浏览

c++ - 有没有办法为模板参数指定所需的定义?

我可以写这个语法吗:

这是为了确保模板参数将具有 SDL_Rect getRect() const

但是我得到了error: unexpected Type "T"。如果我在语法上犯了错误或者根本不允许这样做,有什么建议吗?