Есть ли лучшая практика для адаптации интерфейсов контейнеров STL? - PullRequest
0 голосов
/ 15 января 2019

Наследование от контейнеров STL может привести к неопределенному поведению, и его следует избегать. Есть ли лучшая практика для адаптации интерфейса контейнеров STL? Вводить все функции снова и снова для разных контейнеров не имеет смысла, поэтому мне интересно, может ли набор универсальных адаптеров выполнить эту работу и как они будут выглядеть.

Например, часть интерфейса является общей для всех контейнеров:

template
<
    typename Type,    
    template<typename, typename> class Sequence,
    template <typename T> class Allocator = std::allocator
>
class CommonInterface
{
    public: 

        using container_type = Sequence<Type, Allocator<Type>>; 

        using value_type             = typename container_type::value_type;     
        using allocator_type         = typename container_type::allocator_type; 
        using size_type              = typename container_type::size_type; 
        using difference_type        = typename container_type::difference_type; 
        ...

        decltype(auto) begin()
        {
            return data_.begin(); 
        }

        decltype(auto) cbegin() const 
        {
            return data_.cbegin(); 
        }

        ...      

    protected: 
        container_type data_; 
};

но это не работает для std::array. Также есть контейнеры, которые поддерживают O (1) прямой доступ, и те, которые не поддерживают, так что я могу извлечь части интерфейса в универсальные адаптеры (для всего, кроме array) и использовать наследование, чтобы открыть интерфейс, я полагаю.

Это пахнет для меня, и количество печатания раздражает.

К сожалению, похоже, мне нужно что-то подобное, потому что мне нужно ввести в мою библиотеку множество различных типов , которые по сути являются контейнерами STL. Я использую теги и SFINAE, чтобы различать (геометрические) типы при выборе алгоритмов.

Редактировать : Что бы вы сделали для моделирования многоугольника ( замкнутая цепь точек) и полилинии ( открытая цепочка точек, то же хранилище ) используя любой ( возможно такой же ) контейнер STL?

...