Я абсолютно потерян при попытке портировать Ричард Лорд Эш Рамочная на «чистый» 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())));
…
Конструктор в 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 сущность является только контейнером, который существует по соображениям удобства использования и может быть полностью заменен простым целочисленным идентификатором, но потому что это уничтожает сущности удобства использования, хранят ссылки на их компоненты для более простого разрешения для программиста.
Других решений пока нет …