Похоже, у меня было фундаментальное недоразумение о C ++: <</p>
Мне нравится полиморфный контейнерный раствор. Спасибо ТАК, что обратили на это мое внимание:)
Итак, нам нужно создать относительно общий тип объекта контейнера. Также происходит инкапсуляция некоторой бизнес-логики. Однако нам нужно хранить в этом контейнере практически произвольные данные - от простых типов данных до сложных классов.
Таким образом, можно сразу перейти к идее шаблонного класса и покончить с этим. Тем не менее, я заметил, что полиморфизм C ++ и шаблоны плохо сочетаются друг с другом. В связи с тем, что есть некоторая сложная логика, с которой нам придется работать, я бы предпочел просто придерживаться либо шаблона, либо полиморфизма, а не пытаться бороться с C ++, заставляя его делать то и другое.
Наконец, учитывая, что я хочу сделать одно или другое, я бы предпочел полиморфизм. Я считаю, что гораздо проще представлять ограничения типа «этот контейнер содержит сопоставимые типы» - а-ля Java.
Подводя меня к теме вопроса: самое абстрактное, я представляю, что у меня может быть чисто виртуальный интерфейс «Контейнер», который имеет что-то вроде «push (void * data) и pop (void * data)» ( для записи, я на самом деле не пытаюсь реализовать стек).
Однако мне не очень нравится void * на верхнем уровне, не говоря уже о том, что подпись будет меняться каждый раз, когда я хочу добавить ограничение на тип данных, с которыми может работать конкретный контейнер.
Подведение итогов: у нас есть относительно сложные контейнеры, которые имеют различные способы извлечения элементов. Мы хотим иметь возможность варьировать ограничения на элементы, которые могут входить в контейнеры. Элементы должны работать с несколькими типами контейнеров (при условии, что они соответствуют ограничениям данного конкретного контейнера).
Редактировать: Я должен также упомянуть, что сами контейнеры должны быть полиморфными. Это моя основная причина отказа от использования шаблонного C ++.
Итак, должен ли я отказаться от своей любви к интерфейсам типа Java и использовать шаблоны? Должен ли я использовать void * и все статически разыграть? Или я должен пойти с пустым определением класса «Элемент», который ничего не объявляет, и использовать его в качестве моего класса верхнего уровня в иерархии «Элемент»?
Одна из причин, почему я люблю переполнение стека, заключается в том, что многие ответы дают интересную информацию о других подходах, которые я даже не рассматривал. Так что заранее спасибо за ваши идеи и комментарии.