Я пытаюсь написать класс разреженной матрицы quadtree. Короче говоря, quadtree_matrix<T>
— это либо нулевая матрица, либо четверка (ne, nw, se, sw)
из quadtree_matrix<T>
.
В конечном итоге я хотел бы протестировать различные схемы распределения, поскольку это, вероятно, повлияет на производительность операций линейной алгебры. Поэтому я также создам шаблон quadtree_matrix
для стандартного типа распределителя, чтобы можно было повторно использовать существующие распределители.
Мне придется выделить два разных типа данных: либо T
, либо node
, которые содержат четыре указателя (либо на T, либо на node). Для всех алгоритмов, которые я буду рассматривать, я точно знаю, какие данные ожидать, потому что я знаю, каковы размеры подматриц, с которыми я сталкиваюсь в любой точке алгоритма (мне даже не нужно хранить эти размеры).
Я, конечно, буду использовать два разных распределителя: это нормально, поскольку типы распределителей предоставляют шаблон rebind
и конструктор копии шаблона (и предназначены для использования в качестве типов значений, как предполагают члены get_allocator
стандартных контейнеров, возвращая копию) .
Проблема в том, что функции-члены распределителя используют определенный тип pointer
, который не обязательно должен быть ванильным указателем. Некоторые распределители (ускоренные межпроцессные распределители) широко используют эту функцию.
Если бы типы указателей распределителя были указателями садового типа, у меня не было бы проблем: по крайней мере, я мог бы использовать указатели для пустоты и переинтерпретировать_приводить их к нужному типу (либо node*
, либо T*
). Я мог бы также использовать союз (вероятно, лучше).
Насколько я знаю, нет требований к PODness для типов allocator::pointer
. Они должны быть только итераторами с произвольным доступом.
Теперь мой вопрос:
Учитывая шаблон класса распределителя A<T>
(или его эквивалент A::rebind<T>::other
), есть ли какие-либо гарантии относительно:
- Возможность статического преобразования
A<T>::pointer
вA<U>::pointer
при условии, чтоU
является доступной базойT
? - Возможность статического приведения
A<T>::pointer
кA<U>::pointer
при условии, чтоT
является доступной базойU
, а "тип среды выполнения" (что бы это ни значило в данном контексте) каста равенU
? - Тип
A<void>::pointer
(если это имеет смысл)?
Или есть решение моей проблемы, о котором я не подумал?