C++概念复合需求和返回型需求。

上一次我在GCC和fconcepts标志下使用C++概念时,下面的代码段就可以用了。

template <typename T, typename U>
concept equality_comparable = requires(T a, U b) {
  { a == b } -> bool;
  { a != b } -> bool;
};

显然,这种情况已经不复存在了,而一个。返回类型-要求 在…之后 复合需求 现在只能包含类型约束。如果我没有弄错的话,这基本上意味着用另一个概念来满足 返回类型-要求.

所以,完美的可读性和(对于C++标准来说)简短的片段变成了

template <typename From, typename To>
concept convertible_to = std::is_convertible_v<From, To>;

template <typename T, typename U>
concept equality_comparable = requires(T a, U b) {
  { a == b } -> convertible_to<bool>;
  { a != b } -> convertible_to<bool>;
};

当然,这甚至不是一个完整的实施,但我们暂时忽略这一点。谁能给我解释一下,为什么委员会决定改变这个概念?我个人觉得convertible_to概念中的那个 “隐式使用的模板参数 “极其刺激和混乱。

解决方案:

那么,这到底是什么意思呢。

template <typename T, typename U>
concept equality_comparable = requires(T a, U b) {
  { a == b } -> bool;
  { a != b } -> bool;
};

它是否意味着 a == b 必有型 恰恰 bool还是说,如果你的类型发生变化,你就会得到 bool (即 const boolbool& 是可以的),还是说可以转换为……?bool (即 std::true_type is ok)?) 我觉得从句法上看根本说不清楚–而且这三者中的任何一个都可能是某一特定概念所需要的意义(如 P1452 指出,在当时的情况下。Same<T>ConvertibleTo<T> 在概念中是40-14)。)

本文还指出,在概念TS中,其中的 -> Type 的存在,我们也有能力写出类似于 vector<Concept>…或 -> vector<Concept> 作为一种要求。这是一个类型,但会表现出非常困难的与 decltype(()) 语义,我们在 P1084.

基本上我不认为 “完全可读 “的片段实际上是–该语法有多种潜在的含义,所有这些含义都可以根据上下文的不同而成为所需的含义。而当时最常用的一种(same_as<bool>)甚至不是我们在这里想要的那个(convertible_to<bool>).


我个人觉得convertible_to概念中的那个 “隐式使用的模板参数 “非常恼火和混乱。

这在C++中很新颖,但我个人觉得在这些情况下读起来挺好的。看得出来。

{ a == b } -> convertible_to<bool>;

只是读起来和需求完全一样。a == b 需要是一个有效的表达式,可以转换为: bool. 对于单利概念,它的用法相当不错,因为你可以用它们来代替有点无意义的 typenameclass 关键字。

template <range R>
void algo(R&& r);

和其他语言没什么区别 比如说,在Rust中。

fn algo<I: Iterator>(i: I)

那里的 “隐式使用的模板参数 “是如此的隐蔽,甚至不属于 “模板参数 “的一部分。特质声明在这里也是隐含的。

pub trait Iterator { ... }

所以,即使是一个较长形式的语法,你也会写成: where I: Iterator 而在C++中,你还是会写 requires range<R>.

这不是严格相关的原始问题,但我只是觉得它有趣的添加一些其他颜色。

给TA打赏
共{{data.count}}人
人已打赏
未分类

Javascript - 在百分比函数后使用Math.round

2022-9-9 8:15:18

未分类

无法在这个ManagedType上找到指定名称的Attribute[unknown]。

2022-9-9 8:15:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索