C ++: Реализация «пепла» Структура сущности

Я абсолютно потерян при попытке портировать Ричард Лорд Эш Рамочная на «чистый» C ++ (MSVC Express 2008) или, по крайней мере, я не смог найти ни одной реализации,
Я возиться с бустом: fusion libs для реализации минимальных требований к отражению, которые требуются фреймворкам, но метапрограммирование шаблонов приходит как новое для меня, и я переполнен ошибками компилятора и длительным тестированием сбоев 🙁 …

Кто-нибудь знает о целесообразности или полезности для портирования фреймворка?

Взяв в качестве примера класс Entity, кто-нибудь может уточнить, как мне достичь такого результата, как:

(ЭТО ФЛЕКС-КОД!)

    waitEntity = new Entity( "wait" )
.add( new WaitForStart( waitView ) )
.add( new Display( waitView ) )
.add( new Position( 0, 0, 0 ) );

с реализацией C ++, как это?

    ...
namespace bf = boost::fusion;
namespace bm = boost::mpl;

template<typename ComponentMap>
class EntityASH{
public:
EntityASH(ComponentMap c)
:m_components(c){   }
//"fusion-style" trying to return a new Components template entity for a new component type
template<typename T>
EntityASH
template<typename T>
/*¿Here im absoltely lost
EntityASH<
result_of::as_map<
typename result_of::push_back<ComponentMap,
fusion::pair<T,T>
>::type
>
>*/
EntityASH *add(){
typedef bf::pair<T, T> newTentryPair;
//bf::as_map(bf::push_back<ComponentMap,newTentryPair>(m_components,newTentryPair()));

return new EntityASH(bf::as_map(bf::push_back<ComponentMap,newTentryPair>(m_components,newTentryPair())));

0

Решение

Конструктор в C ++ не может возвращать что-либо, поэтому вы должны использовать другой метод для создания сущности, посредством чего createEntity () должен возвращать ссылку или std :: shared_ptr объекта сущности.

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

std::shared_ptr<Entity> createEntity() {
return std::make_shared<Entity>();
}

...

std::shared_ptr<Entity> addComponent(ComponentBase comp) {
mComponents.add(comp);
return shared_from_this();
}

...

createEntity().add(new Position())
.add(new Display())
.add(new Position());

Я не понимаю, почему вы хотите использовать шаблоны здесь? Вы хотите, чтобы компоненты стали реальной частью типа сущности? Это будет означать, что вы не можете добавлять / удалять компоненты во время выполнения простым способом.

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector