Могу ли я иметь свой торт и съесть его с последовательностями полиморфных типов ценностей?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Могу ли я иметь свой торт и съесть его с последовательностями полиморфных типов ценностей?

Сообщение Anonymous »

Я разрабатываю определенную часть библиотеки и рассматриваю, использовать ли полиморфные типы значений или нет. Если вы не знаете, что это такое и какова может быть мотивация для них, посмотрите первые несколько параграфов этого вопроса, разговоры о полиморфизме во время выполнения Шона и, возможно, разговоры Клауса Инглбергера о std :: variant Структуры иерархи. Проспективные члены данных и методы - но не все. Код для B и C еще не написан. Итак, я могу играть с их макетом, я могу выбрать то, что они наследуют, если что -то, я могу решить, что у них будет заполнение или дополнительные члены и т. Д. Давайте предположим, что последовательность будет передана как std :: span , чтобы сделать вещи простыми.
Я мог бы сделать это с помощью наследства и ссылочных типов : определить класс для общей общей, имеет B и C -nherit a и проходить последовательность оповедников: void f (std :: span a*nemerit a>. Это сработает, но мне нужно было бы построить последовательность указателей-даже если, например, у меня есть вектор All-B или All-C. Что еще хуже, мои пользователи , скорее всего, будут поручены этой конструкции. Но тогда будет распределение кучи для каждого объекта, и, кроме того, если вы посмотрите на необработанную память, которую использует вектор, вы не увидите B или C, вы будете видеть данные указателя и, возможно, данные Deteter. Итак, если у меня есть, скажем, std :: span где -то - я не могу передать его в f () (напрямую или путем повторного/извлечения его данных () и т. Д.) - Мне придется построить отдельный вход для f ()
. Третий альтернативный Но - объекты этого типа сами не полиморфны, так что код f () не смог бы равномерно обращаться с элементами и должен был бы распаковывать/коллеги в каждом значении, и я бы предпочел избежать этого. То есть, я хочу:
  • Pass std :: span> to f ()
    Не выполнять. std :: span или std :: span as std :: span>
  • без неопределенного поведения ...
это мечта о трубе, или это возможно? Не указал стандартную версию C ++. Если ответ «да», попробуйте использовать самую раннюю стандартную версию, по вашему мнению, и скажите, на какую версию вы полагаетесь.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... alue-types
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»