Наследование от контейнеров 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?