문제

일련의 데이터 포인트를 (이름, 값) 형식으로 저장해야합니다. 여기서 값이 다른 유형을 사용할 수 있습니다.

각 데이터 포인트에 대한 클래스 템플릿을 사용하려고합니다.그런 다음 내가 보는 각 데이터 포인트에 대해 새로운 객체를 만들고 벡터로 다시 밀어 넣고 싶습니다.각 새 유형에 대해 먼저 템플릿에서 새 클래스를 만들어야합니다.그러나 벡터는 모든 항목에 대해 동일한 유형을 기대하므로 벡터에서 생성 된 객체를 저장할 수 없습니다.저장 해야하는 유형은 상속 계층 구조에 장착 할 수 없습니다.그들은 관련이 없습니다.또한 미래에 더 많은 유형이 생성 될 수 있으며 각 새 유형의 스토리지 서비스를 변경하고 싶지 않습니다.이러한 항목을 저장하기 위해 이기종 컨테이너를 만드는 방법이 있습니까? 고맙습니다!

도움이 되었습니까?

해결책

부스트 라이브러리는 아마도 당신이 찾고있는 것 (부스트 ::)을 찾고 있습니다.Boost를 사용할 수없는 경우 포장 된 포인터 접근 방식을 사용하여 직접 굴릴 수 있습니다 ...

다른 팁

boost::any는 이미 권장되었지만, 아무것도 권장 했으므로 그것으로부터 많이 기대할 수 없습니다.

앞서 다양한 유형을 알고 있으면 boost::variant를 사용하는 것이 좋습니다.

typedef boost::variant<Foo, Bar, Joe> variant_type;

struct Print: boost::static_visitor<>
{
  void operator()(Foo const& f) const { f.print(std::cout); }

  template <class T>
  void operator()(T const& t) const { std::cout << t << '\n'; }
};

void func(variant_type const& v) // not template
{
  boost::apply_visitor(Print(), v); // compile-time checking
                                    // that all types are handled
}
.

컨테이너에 액세스하려는 컨테이너의 문제점은 해당 유형을 결정한 다음 실제 유형으로 캐스팅해야합니다.이것은 추악하고 비효율적이며 오류가 발생하기 쉽습니다. 이는 C ++의 # 1 선택이 매우 좋은 이유가 아닌 한, 실제로 C ++ 경력을 실제로 보지 못했습니다.

나는 당신이 한 쌍 (타입, void *)을 가질 수 있고, 쌍을 묘사 한 종류에 따라 void *를 던지는 자신의 팝 기능을 작성한 다음 이들을 당신의 눈을 잡는 컨테이너에 어떤 컨테이너로 옮기는 것을 푸십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top