В проекте трассировки лучей, который я пытаюсь сделать во время компиляции (constexpr) для развлечения и задачи, я столкнулся с небольшой проблемой: у меня есть объект (пересечение), который должен ссылаться на одингруппы других объектов (фигур).
Теперь я понимаю, что вы не можете использовать полиморфизм / виртуальные методы с constexpr из-за поиска в vtable, поэтому, насколько я знаю, у меня не может быть суперкласса,Shape
, из которого происходят другие классы.Таким образом, мне нужно сделать Intersection
шаблонным классом, который содержит одну из его форм.
К сожалению, мне нужно хранить эти Intersection
классы в массиве или каком-либо другом контейнере, и я хочу иметь возможностьдля вызова общей функции над ними и их формой, т. е. когда появляется псевдополиморфизм.
Я реализовал что-то, что решает проблему, где я беру std::array
из std::variant
и всякий раз, когда добавляю в массив, если тип не представлен ничем в std::variant
, я расширяю его.Я также могу достичь псевдополиморфизма, используя std::visit
, вызывая функцию с общим именем для каждого элемента, чтобы получить std::array
конечных элементов.
Моя реализация здесь, в этой сущности.Я думал, что это будет слишком долго, чтобы публиковать:
https://gist.github.com/sraaphorst/28998c109f94a78616e7dd488c1491d1
Теперь я знаю, что решать проблемы гораздо сложнее, чем необходимо, поэтому мне было интересно, если какой-либо изВы знаете более простой способ добиться этого?