2016-11-14 2 views
1

Итак, я создаю свою собственную систему компонентов Entity-Component, и я застрял в методе AddComponent Entity, который добавляет компоненты к Enity, вот как это выглядит:, который принимает класс как параметр шаблона и принимает параметры конструктора классов в качестве параметров метода.

template <typename T> 
void AddComponent() { 
    NumOfComponents++; 
    AllComponents.push_back(new T()); 
} 

это работает отлично, но что, если у меня есть компонент конструктор? Как так

class Transform : public Component 
{ 
public: 
    Transfrm(Vector3f newPosition, Vector3f newRotation, Vector3f newScale) : Component("Transfrm") {}; 

    Vector3f Position; 
    Vector3f Rotation; 
    Vector3f Scale; 
    ~Transfrm(); 
}; 

То, что я пытаюсь достичь что-то вроде этого:

Entity ent1; 
Vector3f Pos, Rot, Scl; 
ent1.AddComponent<Transform>(Pos, Rot, Scl); // This is currently not possible 

Как принимать Transform-х параметров метода в качестве параметров метода AddComponent, и добиться чего-то подобного, что выше?

ответ

5

Это самый простой вариант использования пакета параметров.

template <typename T, typename ...Args> 
void AddComponent(Args && ...args) { 
    NumOfComponents++; 
    AllComponents.push_back(new T(std::forward<Args>(args)...)); 
} 

Требуется минимум C++ 11.

+0

привет код, который вы показали мне дает мне две ошибки в строке 24, который является «недействительным AddComponent (Args && ..args) {» Ошибка \t \t C3484 синтаксическая ошибка: ожидается, «->» перед типом возвращаемого \t Ошибка \t C3613 \t Отсутствует тип возврата после '->' ('int' предполагается) 24 – kooldart

+0

Маленькая опечатка. Один период отсутствовал. –

+0

никогда не исправлял его, заменил «..args» на 3 пунктирных аргумента: «... args» – kooldart

Смежные вопросы