Как добиться псевдополиморфизма constexpr? - PullRequest
0 голосов
/ 04 октября 2018

В проекте трассировки лучей, который я пытаюсь сделать во время компиляции (constexpr) для развлечения и задачи, я столкнулся с небольшой проблемой: у меня есть объект (пересечение), который должен ссылаться на одингруппы других объектов (фигур).

Теперь я понимаю, что вы не можете использовать полиморфизм / виртуальные методы с constexpr из-за поиска в vtable, поэтому, насколько я знаю, у меня не может быть суперкласса,Shape, из которого происходят другие классы.Таким образом, мне нужно сделать Intersection шаблонным классом, который содержит одну из его форм.

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

Я реализовал что-то, что решает проблему, где я беру std::array из std::variant и всякий раз, когда добавляю в массив, если тип не представлен ничем в std::variant, я расширяю его.Я также могу достичь псевдополиморфизма, используя std::visit, вызывая функцию с общим именем для каждого элемента, чтобы получить std::array конечных элементов.

Моя реализация здесь, в этой сущности.Я думал, что это будет слишком долго, чтобы публиковать:

https://gist.github.com/sraaphorst/28998c109f94a78616e7dd488c1491d1

Теперь я знаю, что решать проблемы гораздо сложнее, чем необходимо, поэтому мне было интересно, если какой-либо изВы знаете более простой способ добиться этого?

...