У меня много проблем с преобразованием основанного на полиморфизме физического механизма, который я написал на основе шаблонов. Раньше я занимался абстрактным классом SpatialBase
(пространственное воспаление) и абстрактным классом ResolverBase
(решатель контактов). Но эти два класса всегда были известны во время компиляции, так почему бы не templatize движок и не удалить накладные расходы виртуального вызова?Циркуляр шаблона зависимости типа для физического движка
Ну, вот проблема:
template<class TS, class TR> class World;
- это World<TS, TR>
класса, TS
является пространственным типом разбиения и TR
типа контакта решателя.
template<class TS, class TR> class Body;
- это класс Body<TS, TR>
. Он должен знать как TS
, так и TR
, потому что он хранит World<TS, TR>&
.
template<class TR> class Grid;
- это класс Grid<TR>
. Он должен знать TR
, потому что он должен знать, что такое Body<Grid, TR>
(он хранит ячейки, в которых хранятся тела).
template<class TS> class ImpulseSolver;
- это ImpulseSolver<TS>
. Он должен знать TS
, потому что он должен знать, что такое Body<TS, ImpulseSolver>
(он напрямую касается внутренних элементов тела).
Теперь ... см. Вопрос? Невозможно объявить правильный World<TS, TR>
!
World< Grid<ImpulseSolver<Grid<ImpulseSolver..., ImpulseSolver<Grid<ImpulseSolver<Grid... > madWorld; // not by Gary Jules
.
Это круговая зависимость. Класс пространственного парирования должен знать о классе решателя и обратном вызове, поскольку оба должны знать точный тип класса Body<TS, TR>
.
Есть ли способ решить это? Или я обречен использовать полиморфизм во время выполнения навсегда?
Я хочу, чтобы пользователь моего физического движка решил, какой метод пространственного разделения и какой метод решения контактов использовать во время компиляции. –
@VittorioRomeo: вы можете сделать 'World' шаблоном, который принимает шаблонные аргументы. – jxh
Я не понимаю, как это могло бы помочь, так как я должен был бы сказать «ImpulseSolver >>' –