gpt4 book ai didi

c++ - 使用 C++20 概念实现 Pair 概念

转载 作者:行者123 更新时间:2023-12-02 14:07:24 25 4
gpt4 key购买 nike

要打印任何类型的std::pair,我们可以实现以下方法:

template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second << std::endl;
}

但是假设我们想要实现一个可以打印任何类型的对的方法,不一定是 std::pair,基于以下要求:

  • 它有一个 firstsecond 公共(public)字段
  • 它有一个 first_typesecond_type 公共(public)内部类型
  • first 的类型 == first_type
  • 第二个的类型 == second_type

有了一个概念,我们称之为配对,可以允许编写如下方法:

void printPair(const Pair auto& p) {
std::cout << p.first << ", " << p.second << std::endl;
}

如何定义这样一个概念

最佳答案

这里有一些有趣的微妙之处。

template<class P>
concept Pair = requires(P p) {
typename P::first_type;
typename P::second_type;
p.first;
p.second;
requires std::same_as<decltype(p.first), typename P::first_type>;
requires std::same_as<decltype(p.second), typename P::second_type>;
};

前四行有些多余,但可以帮助生成更好的错误消息。其余几行应该是不言自明的。请注意,在普通类成员访问上使用 decltype 会生成数据成员的声明类型。

最后两行也可以写成

    { p.first } -> std::same_as<typename P::first_type&>;
{ p.second } -> std::same_as<typename P::second_type&>;

这里,复合要求类型约束应用于decltype((p.first))。该表达式是左值,因此生成的类型是左值引用类型。请注意,此版本将接受 first_type first;first_type& first;

关于c++ - 使用 C++20 概念实现 Pair 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60358244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com