@ Александр C: Я понимаю :) И это твои усилия: p
аюсь написать разреженный матричный класс. Короче говоря,quadtree_matrix<T>
это либо нулевая матрица, либо четверка(ne, nw, se, sw)
изquadtree_matrix<T>
.
В конечном итоге я хотел бы протестировать различные схемы распределения, поскольку это, вероятно, повлияет на производительность операций линейной алгебры. Так что я буду также шаблонquadtree_matrix
на стандартный тип распределителя, так что я могу повторно использовать существующие распределители.
Я должен буду выделить два разных вида данных: либоT
илиnode
, который содержит четыре указателя (либо на T, либо на узел). Для всех алгоритмов, которые я рассмотрю, я точно знаю, какие данные ожидать, потому что я знаю, каковы размеры подматриц, с которыми я сталкиваюсь в любой точке алгоритма (мне даже не нужно хранить эти размеры).
Я, конечно, буду использовать два разных распределителя: это нормально, так как типы распределителей обеспечиваютrebind
шаблон и конструктор копирования шаблона (и предназначены для использования в качестве типов значений, какget_allocator
члены стандартных контейнеров предлагают, вернув копию).
Проблема в том, что функции-члены распределителя используют определенныйpointer
тип, который не обязательно должен быть указателем ванили. Некоторые распределители (повышающие межпроцессные распределители) широко используют эту функцию.
Если бы указатели типа распределителя были указателями разнообразия садов, у меня не возникло бы никаких проблем: по крайней мере, я мог бы использовать указатели, чтобы аннулировать и повторно интерпретировать их в нужный тип (либоnode*
или жеT*
). Я мог бы также использовать союз (возможно, лучше).
Насколько я знаю, нет никаких требований к PODallocator::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
(если это имеет смысл)?Или есть решение моей проблемы, о котором я не думал?