问题标签 [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++ - 为什么 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 实现中检查了这一点,它就像我描述的那样工作。除非提供所有运算符,否则代码不会编译。
c++ - 使用私有成员变量时传递 lambda 是否违反封装?
我写了一个函数来传递给第三方的类。静态函数可以正常工作,直到该函数需要访问私有成员变量才能完成其工作。我可以使用 lambda 表达式来做到这一点(假设它自动或通过转换转换为 std::function )。
例子:
但我真的不明白我在做什么。现在这个其他类正在使用来自不同类的私有成员变量。这不违反封装吗?这是黑客还是我错过/误解了一个概念?
c++ - C++模板参数默认函数实现
我有一组用作模板参数的类。它们都符合一些非正式的界面(又名概念)
在这个例子中,假设我用Foo
orBar
作为参数来实例化模板,所以它们必须实现方法a
b
和c
.
现在,我有很多这样的类,我希望有一个函数的默认实现,就其他函数而言。
例如,我想默认c
返回和之间的差异a()
。b()
所以我希望我定义a()
并自动实现就足够了,b()
而无需为所有类复制此代码。c()
int c() { return a()- b();}
我曾经通过多态性来实现这个结果(通过在具有默认(虚拟)实现的基类中定义a()
和作为纯虚函数),但出于性能原因,我放弃了这种机制。b()
c()
我想知道是否有推荐的解决方案来使用我的模板参数类获得这种结果(即编写一次默认实现)。
c++ - 在知道可调用参数之前,如何约束惰性组合?
所以我在玩 GCC6 及其概念实现,我认为 Haskell Prelude 将是一个很好的实验来源。Haskell 的核心特性之一是函数组合,这是我需要立即解决的问题。
尽我所能模仿 Haskell 语法,我写了这个函数:
效果很好,让我可以做以下事情:
很高兴,我决定回去对我的函数组合应用一些约束,但由于它的懒惰,我很快遇到了一个问题。
首先我写了这个概念:
我基于Andrew Sutton 的原始github 项目中的概念。
所以我试图应用到我原来的功能。我遇到的问题是我不知道G
返回什么而不知道传递给什么参数,G
所以我无法约束G
,我不知道F
返回什么而不知道它给出了什么参数,我不知道,因为我不知道G
返回什么。
我很确定我需要一个Function
不关心返回类型的新概念,因为我的组合函数不关心F
返回什么,只要它是可调用的。而且我想我可以对内部 lambda 进行约束,即参数类型并更正 G 和 F 但这意味着我可以编写不可组合的函数并且在调用站点之前不会出错。这是可以避免的吗?
也许是这样的:
这是我能做的最好的吗(如果我能做到的话)?
c++ - C++ 概念:我可以定义一个本身就是模板的概念吗?
对不起,如果问题不是太清楚。我不确定表达它的最佳方式(随意编辑!)。我认为一个例子是最清楚的:
我试图根据Haskell 定义定义一个 Monad 概念。绑定运算符 ( >>=
) 要求 aMonad
类型A
可以绑定到一个接受A
并返回 aMonad
类型的函数B
。我可以A
根据value_type
typedef 进行定义,但是如何B
在我的概念中定义类型?
在上面的例子中,我用什么来代替_1
Function<> 概念中的?
这是否也足以将调用 f 的结果限制为任何类型的 Monad?
c++ - 有没有办法为模板参数指定所需的定义?
我可以写这个语法吗:
这是为了确保模板参数将具有 SDL_Rect getRect() const
但是我得到了error: unexpected Type "T"
。如果我在语法上犯了错误或者根本不允许这样做,有什么建议吗?