gpt4 book ai didi

c++ - 如何为 std::pair 引用包装器的范围定义 C++ 概念?

转载 作者:行者123 更新时间:2023-12-05 09:26:27 27 4
gpt4 key购买 nike

请参阅下面的代码(也在此处 https://www.godbolt.org/z/hvnvEv1ar )。如果我取消注释 rngpair 的约束,代码将无法编译。我觉得我遗漏了一些微不足道的东西,但我想不通为什么不满足约束条件。

#include <vector>
#include <ranges>
#include <utility>

template <typename T>
struct is_reference_wrapper : std::false_type {};
template <typename T>
struct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type {};
template <typename T>
inline constexpr bool is_reference_wrapper_v = is_reference_wrapper<T>::value;
template <typename T>
concept ReferenceWrapper = is_reference_wrapper_v<T>;
template <typename T>
concept ReferenceWrapperPair = requires(const T& t) {
{ t.first } -> ReferenceWrapper;
{ t.second } -> ReferenceWrapper;
};
template <typename T>
concept ReferenceWrapperPairRange =
std::ranges::range<T> && ReferenceWrapperPair<std::ranges::range_value_t<T>>;

int main()
{
std::vector<std::pair<int, int>> v{ {1,2}, {3,4}, {5,6} };
auto fn = [](std::pair<int, int>& val) {
return std::pair{std::reference_wrapper<int>{val.first}, std::reference_wrapper<int>{val.second} };
};
/* ReferenceWrapperPairRange */ auto rng = v | std::views::transform(fn);
/* ReferenceWrapperPair */ auto pair = *(rng.begin());
ReferenceWrapper auto first = pair.first;
ReferenceWrapper auto second = pair.second;
return 0;
}

最佳答案

复合要求{ expression } -> type-constraint要求 decltype((expression))必须满足 type-constraint 施加的约束, 自 decltype((t.first))将被视为普通的左值表达式,它将导致 const 左值引用类型。

你可能想使用 C++23 auto(x)获取衰减类型

template <typename T>
concept ReferenceWrapperPair = requires(const T& t) {
{ auto(t.first) } -> ReferenceWrapper;
{ auto(t.second) } -> ReferenceWrapper;
};

或更改ReferenceWrapper概念:

template <typename T>
concept ReferenceWrapper = is_reference_wrapper_v<std::remove_cvref_t<T>>;

关于c++ - 如何为 std::pair 引用包装器的范围定义 C++ 概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73951667/

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