通过C ++ 20概念和三向比较,我做出了这样的自己的决定Map
:
template<
typename TKey,
typename TValue,
std::strict_weak_order<TKey, TKey> KeyComparer = std::compare_three_way, // Error: template constraint not satisfied
typename PairAllocator = std::allocator<KeyValuePair<TKey, TValue>>
>class SortedMap
当SortedMap
初始化时,它与错误而失败template constraint not satisfied
。
修改std::strict_weak_order
为typename
可以。(错误肯定在这里。)
为什么std::compare_three_way
不满意std::strict_weak_order
?
std::strict_weak_order<R, T, U>
要求R
是谓词-调用R
类型的对象T
并U
给你bool
。但是std::compare_three_way
不返回bool
,而是返回<=>
(例如std::strong_ordering
)结果的比较类别之一。
在标准库中,目前尚无任何概念可用于返回比较类别的可调用对象(以与usestrict_weak_order
的概念概括相同的方式<
)。
所以:
template <typename T, typename Cat>
concept compares_as = std::same_as<std::common_comparison_category_t<T, Cat>, Cat>;
template <typename R, typename T, typename U>
concept three_way_order = std::regular_invocable<R, T, U>
&& compares_as<std::invoke_result_t<R, T, U>, std::weak_ordering>;
这将拒绝部分订单-这意味着你不能将其double
作为键(或者不能<=>
直接用作比较,用户必须提供自定义比较功能才能拒绝NaN或类似商品)。如果你想直接处理容器中的部分订单,请std::weak_ordering
转到std::partial_ordering
上面。
或者
<
为std::map
做,所以你会使用std::less<>
或std::less<Key>
作为默认的比较类型。由于无论如何x < y
都可以重写(x <=> y) < 0
,因此<=>
如果<
实现的方式仍然可以使用。但是在你的容器实现中,你只会得到bool
双向比较结果(例如std::strong_ordering
),而不是双向比较结果(例如)。