Я пытаюсь написать класс разреженных матриц квадродерева. Короче говоря, quadtree_matrix
является либо нулевой матрицей, либо четверкой (ne, nw, se, sw)
из quadtree_matrix
. . 12169] Я хотел бы в конце концов протестировать различные схемы распределения, поскольку это, вероятно, повлияет на производительность операций линейной алгебры. Поэтому я также буду использовать шаблон quadtree_matrix
для стандартного типа распределителя, чтобы я мог повторно использовать существующие распределители.
Мне нужно будет выделить два разных типа данных: либо T
, либо или узел
, который содержит четыре указателя (либо на T, либо на узел). Для всех алгоритмов, которые я рассмотрю, Я точно знаю, каких данных ожидать, потому что знаю, каковы размеры подматриц, с которыми я сталкиваюсь на любом этапе алгоритма (мне даже не нужно хранить эти размеры).
Я, конечно, буду с использованием двух разных распределителей: это нормально, поскольку типы распределителей предоставляют шаблон rebind
и конструктор копирования шаблона (и предназначены для использования в качестве типов значений, как члены get_allocator
стандарта контейнеры предлагают путем возврата копии).
Проблема в том, что функции-члены распределителя используют определенный тип указателя
, который не обязательно должен быть обычным указателем. Некоторые распределители (повышающие межпроцессорные распределители) широко используют эту функцию.
Если бы типы указателей распределителя были указателями разнообразия садов, у меня не было бы проблем: по крайней мере, Я мог бы использовать указатели, чтобы аннулировать и повторно интерпретировать их к нужному типу (либо node *
, либо T *
). Я также мог бы использовать объединение (возможно, лучше).
Насколько я знаю, нет требований к POD для типов allocator :: pointer
. Они должны быть только итераторами с произвольным доступом.
Теперь мой вопрос:
Учитывая шаблон класса распределителя A
(или его эквивалент A :: rebind
), есть ли гарантия на:
A :: pointer
в A :: pointer
при условии, что U
является доступной базой T
? A :: pointer
в A :: указатель
при условии T
является доступной базой для U
, а «тип времени выполнения» (что бы это ни значило в данном контексте) литейщика - U
? A :: pointer
(если это имеет смысл)? Или есть решение моей проблемы, о котором я не думал?