Как вы определяете концепцию C ++ для контейнеров стандартной библиотеки? - PullRequest
0 голосов
/ 28 февраля 2020

Я хотел бы реализовать концепцию C ++ для контейнеров стандартной библиотеки.

Заранее большое спасибо!

Ответы [ 2 ]

3 голосов
/ 28 февраля 2020

Есть предварительная концепция Требования к контейнеру . Как концепция, которая выглядела бы как

template <class T>
concept container = requires(T a, const T b)
{
    requires regular<T>;
    requires swappable<T>;
    requires erasable<typename T::value_type>;
    requires same<typename T::reference, typename T::value_type &>;
    requires same<typename T::const_reference, const typename T::value_type &>;
    requires forward_iterator<typename T::iterator>;
    requires forward_iterator<typename T::const_iterator>;
    requires signed<typename T::difference_type>;
    requires same<typename T::difference_type, typename std::iterator_traits<typename T::iterator>::difference_type>;
    requires same<typename T::difference_type, typename std::iterator_traits<typename T::const_iterator>::difference_type>;
    { a.begin() } -> typename T::iterator;
    { a.end() } -> typename T::iterator;
    { b.begin() } -> typename T::const_iterator;
    { b.end() } -> typename T::const_iterator;
    { a.cbegin() } -> typename T::const_iterator;
    { a.cend() } -> typename T::const_iterator;
    { a.size() } -> typename T::size_type;
    { a.max_size() } -> typename T::size_type;
    { a.empty() } -> boolean;
};

, хотя вы бы хотели express часть этого как requires range<T>

2 голосов
/ 02 марта 2020

Исправлен ответ Калет с библиотекой концепций C ++:

    template <class ContainerType> 
    concept Container = requires(ContainerType a, const ContainerType b) 
    {
        requires std::regular<ContainerType>;
        requires std::swappable<ContainerType>;
        requires std::destructible<typename ContainerType::value_type>;
        requires std::same_as<typename ContainerType::reference, typename ContainerType::value_type &>;
        requires std::same_as<typename ContainerType::const_reference, const typename ContainerType::value_type &>;
        requires std::forward_iterator<typename ContainerType::iterator>;
        requires std::forward_iterator<typename ContainerType::const_iterator>;
        requires std::signed_integral<typename ContainerType::difference_type>;
        requires std::same_as<typename ContainerType::difference_type, typename std::iterator_traits<typename
    _ContainerType_::iterator>::difference_type>;
        requires std::same_as<typename ContainerType::difference_type, typename std::iterator_traits<typename
    _ContainerType_::const_iterator>::difference_type>;
        { a.begin() } -> typename ContainerType::iterator;
        { a.end() } -> typename ContainerType::iterator;
        { b.begin() } -> typename ContainerType::const_iterator;
        { b.end() } -> typename ContainerType::const_iterator;
        { a.cbegin() } -> typename ContainerType::const_iterator;
        { a.cend() } -> typename ContainerType::const_iterator;
        { a.size() } -> typename ContainerType::size_type;
        { a.max_size() } -> typename ContainerType::size_type;
        { a.empty() } -> boolean;
    };
...