如何定义一个 C++ 概念来检查给定的模板类型参数是否是pair的顺序容器<T, T>

问题描述 投票:0回答:2

如何定义 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, ...}
)

谢谢。

c++ c++20 template-meta-programming c++-concepts c++-templates
2个回答
0
投票

我认为你不能直接写出一个与所有

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>>;



0
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.