2016-08-14 3 views
1

Я храню коллекцию std::vector s в std::tuple. Однако, когда я получаю элемент из кортежа и изменяю его, я только модифицирую копию возвращаемого элемента.Получение копии вместо ссылки из std :: tuple

template<typename... Ts> 
class ComponentStore 
{ 
public: 
    ComponentStore() 
    { 

    } 
    ~ComponentStore() 
    { 

    } 

    template<typename T> 
    std::vector<T>& Get() 
    { 
     return std::get<std::vector<T>>(m_components); 
    } 

private: 
    std::tuple<std::vector<Ts>...> m_components; 
}; 

Это, как я планирую использовать ComponentStore класс:

ecs::component::ComponentStore<ecs::component::Position, ecs::component::Velocity> comstore; 

//Get the position vector 
auto positionvec = comstore.Get<ecs::component::Position>(); 
//Add a new position 
positionvec.emplace_back(ecs::component::Position{}); 


//Later on, get the position vector again 
auto positionvec2 = comstore.Get<ecs::component::Position>(); 

//But it's empty??? this is wrong. It should have 1 element. 

ответ

4

с помощью авто само по себе, вы создаете переменную выведенной нереференсного типа, так

auto positionvec = comstore.Get<ecs::component::Position>(); 

создает новый вектор;

вы можете исправить это с помощью автоматического &:

auto& positionvec = comstore.Get<ecs::component::Position>();