2016-06-24 4 views
0

작은 3D 엔진에서 작업 중이며 조명, 재료 등을 액세스 할 때마다 내 전체 계층 구조 (모델, 조명)를 반복하지 않도록하는 방법을 궁금합니다.포함 된 유형에 따라 벡터 벡터 검색

모든 목록, 자료에 대한 포인터 목록 또는 조명에 대한 포인터 목록, 유형 목록을 유지하면서 싱글 톤 DataProvider를 만들기로 결정했습니다.

그러나 코드가 너무 복잡해서 새로운 목록을 추가해야 할 때마다 클래스 속성에 코드를 추가해야합니다.

class DataProvider 
{ 
    public: 
    using DataListContainer = std::vector<std::vector<boost::any>>; 
    ... 
private: 
    DataListContainer data_; 

I가 주어진 유형에 따라 내부 벡터를 얻을 수 있습니다 자백 하셨나하고 문제 :

는 드디어 뭔가를하기로 결정? 여기의 모든 과정은 지저분 해 보입니다. 이 외에도 boost::any 유형을 사용하면 내부 벡터 내부의 유형이 고유하다는 것을 실제로 보장 할 수 없으며 혼합 될 수 있습니다. 벡터 벡터를 저장하는 적절한 방법은 무엇입니까? 내부 벡터를 저장하는 유형에 따라 검색하는 방법은 무엇입니까?

+0

을 https://bannalia.blogspot.de/2014/05 /fast-polymorphic-collections.html). – nwp

+0

@nwp : 단 하나의 유형의 컨테이너 만 허용합니다 (예에서 'T'가 일부 복합체가 아니면). 그것은 OP가 '튜플 (tuple)'과 같은 이기종 컨테이너를 원한다는 것을 나타냅니다. – AndyG

+0

@AndyG 그것은 여러 유형을 허용합니다. – nwp

답변

3

난 당신이, 당신은 같은 것을 사용할 수 있습니다 원하는 것을 정확하게 이해하는 경우 : (A [템플릿 표준 : : 벡터를 데이터]를 고려

template <typename ... Ts> 
class DataProviderT 
{ 
public: 
    using DataListContainer = std::tuple<std::vector<Ts>...>; 

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

private: 
    DataListContainer data_; 
}; 

using DataProvider = DataProviderT<Model, Light>; 
+0

나는 이것에 대해 생각하지 않았다. 유일한 문제는 템플릿을 업데이트해야하는 방식에 여전히 방해가된다는 것입니다. 그러나 어쨌든, 그것은 여전히 ​​더 나은 해결책입니다! –