Является ли тип шаблона пустым пространством в C ++? - PullRequest
10 голосов
/ 25 сентября 2011

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

Мы определяем ListNodeBase отдельно от ListNode (ниже), потому что это позволяет нам иметь не шаблонные операции, такие как вставка, удаление (ниже), и это делает так, что узел привязки списка не несет с собой T, что тратить пространство и, возможно, привести к удивлению пользователя из-за дополнительных Ts существующих что пользователь явно не создал. Недостатком всего этого является то, что это затрудняет просмотр списка в режиме отладки, учитывая, что указатели узлов имеют введите 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?

Ответы [ 3 ]

7 голосов
/ 25 сентября 2011

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

1 голос
/ 26 сентября 2011

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

1 голос
/ 25 сентября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...