2016-11-06 9 views
1

나는 내 문제를 합성 힘든 시간을 보내고있어에서 파생 나는 제목이 매우 잘 요약 모르겠어요 제공 구조체에 다형성 컨테이너의 맵을 유지하여 객체의 평면 배열을 제공합니다.는, 그들이 기본 유형

내 문제는 포함 된 개체에 함수를 적용하려고하지만 특정 기본 형식에서 파생 된 개체에만 적용하는 것입니다. 아래에는 내가 성취하려고하는 것의 버려진 버전이 있습니다. 액세스 void*을 반환하여 BaseStock의 요소를 포함에

struct BaseStock {}; 

template <typename ContainedType> 
struct Stock : BaseStock { 
    std::vector<ContainedType> container; 
}; 

struct Store { 
    std::unordered_map<std::type_index, std::unique_ptr<BaseStock>> stocks; 

    template <typename Base> 
    void something() { 
     for (auto& pair: stocks) { 
      // Here, do somehting only if pair.second's 
      // contained type derives from Base 
     } 
    } 
}; 

나는 시도했지만 따라서 유형 검사를 허용하지, 그것에서 dynamic_cast으로 불가능하다. stocks지도는 주식의 포함 된 유형의 type_index을 유지하지만 그 중 하나에서 계층 구조 정보를 검색하는 것은 불가능합니다.

BaseStock이 확인 가능한 항목을 반환하는 것이 가장 가까운 해결책 인 것처럼 보이지만 ContainedType이 항상 무언가에서 파생되도록하는 것을 의미합니다 (전혀 나쁘지는 않지만 사용중인 유형에 제한을 두지 않는 컨테이너)

도움을 주셔서 감사합니다.

답변

1

나는 이것이 당신이 원하는대로한다고 생각한다. 당신이 코멘트에 들어 있지 않은 것에 대한 더 큰 설명을 자유롭게 요청할 수있다.

#include <vector> 
#include <iostream> 
#include <unordered_map> 
#include <typeindex> 
#include <memory> 

struct BaseStock {}; 
template <typename ContainedType> 
struct Stock : BaseStock { 
    std::vector<ContainedType> container; 
}; 

struct Store { 
    std::unordered_map<std::type_index, std::unique_ptr<BaseStock>> stocks; 
    template <typename Base> 
    void something() { 
     for (auto& pair: stocks) { 
      if (typeid(pair.first) != typeid(Base)) { 
       std::cout << "Checking via typeid.\n"; 
      } 
     } 
    } 
}; 

template<typename BaseType, typename DerivedType = BaseType> 
void InsertIntoStore(Store* store) { 
    store->stocks[typeid(BaseType)] = 
     std::unique_ptr<BaseType>(std::make_unique<DerivedType>()); 
} 

int main() { 
    Store store; 
    // Put two things into the map. 
    InsertIntoStore<BaseStock, Stock<int>>(&store); 
    InsertIntoStore<BaseStock>(&store);  
    // But only get one output. 
    store.something<BaseStock>(); 
} 
+0

구현시 여전히 type_index 당 하나의 BaseStock 만있을 수 있습니다! BaseStock의 벡터를 푸는 것은 그것을 해결합니다. 하지만 대답은 정확하고 흥미 롭습니다. 어쨌든 – brainsandwich

+0

당신은 당신의 질문에서 벗어나지 못한'unordered_multimap'을 원합니다. 게시 한 질문에 적절하게 답변 한 경우 제 답변을 수락하십시오. – druckermanly

+0

네, 저는 다른면을 다루는 다른 답변을 기다리고 있었지만, 실제로 당신의 질문에 "적절하게 대답했습니다"라고 게시했습니다. – brainsandwich