如何定义 C++
concept
来检查给定的模板类型参数是否是顺序容器或成对的范围(例如 vector<pair<string, string>>
。
假设
concept
的名称是 KeyValueContainer
。我需要能够做到这一点:
template <KeyValueContainer KVC_T>
void foo(KVC_T kvc)
{
for(const auto [key, value]: kvc)
// do stuff with key and value
}
附注我所说的连续容器或成对范围是指充满成对的容器或范围 (
{pair1, pair2, pair3, ...}
)
谢谢。
我认为你不能直接写出一个与所有
std::pair<T, T>
匹配的概念,但你可以将其写为一个特质。T
如果你想允许任何类似元组的东西有2个元素,你可以改为:
template <typename T>
struct is_homogenous_pair : std::false_type {};
template <typename T>
struct is_homogenous_pair<std::pair<T, T>> : std::true_type {};
template <typename T>
concept homogenous_pair = is_homogenous_pair<T>::value;
template <typename T>
concept KeyValueContainer = std::ranges::range<T> && homogenous_pair<std::ranges::range_value_t<T>>;
template <typename T>
concept homogenous_pair = (std::tuple_size_v<T> == 2) && std::same_as<std::tuple_element_t<0, T>, std::tuple_element_t<1, T>>;
template <typename T>
concept KeyValueContainer = std::ranges::range<T> && homogenous_pair<std::ranges::range_value_t<T>>;
接口适用于类似元组的类型:
get<0>
template<typename T>
concept RangePairs =
ranges::range<T> &&
std::tuple_size_v<ranges::range_value_t<T>> == 2 &&
requires(ranges::range_value_t<T> t)
{
std::get<0>(t);
std::get<1>(t);
requires std::same_as<decltype(std::get<0>(t)), decltype(std::get<1>(t))>;
};
是一种类似元组的类型,所以它可以工作。这当然要求您在内部使用
pair
来访问成员,而不是 get
和 first
。但请注意,这要求两个内部类型“完全相同”是同一类型。从 second
获得的序列使用 map<T, T>
,因此它不符合此要求。如
此处所示。如果您希望此方法适用于任何类似元组类型的
pair<T const, T>
和 T
(即,这两种类型不
have相同),则只需从多于。然后就可以工作了
U
。