Является ли шаблон типа отходов в С++?

Я просмотрел класс списка EASTL, чтобы посмотреть, как автор реализовал узлы. Мое ожидание было упрощенным классом/структурой. Вместо этого я вижу базу и node, которые наследуются от этой базы (все еще упрощенно, но почему два класса?). Его комментарии объясняют, почему:

Мы определяем ListNodeBase отдельно от ListNode (ниже), поскольку это позволяет у нас есть не-шаблонные операции, такие как вставка, удаление (ниже) и делает это так, что привязка списка node не несет с собой T, что отходов и, возможно, приводят к удивлению пользователя из-за дополнительных Ts существующих что пользователь явно не создал. Недостатком всего этого является то, что это делает отладочный просмотр списка более сложным, учитывая, что указатели node имеют тип ListNodeBase, а не ListNode. Однако, смотрите ListNodeBaseProxy ниже.

Я не понимаю здесь нескольких вещей. Я понимаю часть, почему это сделает отладочный просмотр немного сложнее, но что он имеет в виду под list anchor node doesn't carry a T with it и would waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create?

Ответ 1

Без класса-помощника корень списка node будет содержать экземпляр T, который никогда не используется. Во втором предложении говорится, что вы не можете ожидать, что пустой список создаст T. Например, создание T может иметь побочные эффекты.

Ответ 2

Мне кажется, что идея состоит в том, чтобы отделить абстракцию списка от данных, которые он несет. Вам нужно только ListNode, когда вы действительно хотите получить доступ к данным, все остальное можно сделать на абстрактном ListNodeBase. Вот как я понимаю list anchor node doesn't carry a T with it.

Там что-то есть о космосе. Классы шаблонов создаются для каждого типа, поэтому, если у вас есть несколько разных типов, используемых для T, без ListNodeBase вы будете создавать шаблонные копии всех операций для каждого типа, с ним - нет, а LinkNode наследует их и требует только памяти для фактических данных. Кажется, что сохраненное пространство относится к фактическому размеру кода в этом случае.

Ответ 3

Вы действительно хотите поддерживать пустые списки. Если голова node сама всегда содержит один T, и каждый список содержит головку node, то из этого следует, что каждый список содержит хотя бы один T и поэтому никогда не может быть пустым.