문제

균질 키 유형이지만 이기종 데이터 유형이있는 맵을 갖고 싶습니다.

나는 (pseudo-code)와 같은 것을 할 수 있기를 원합니다.

boost::map<std::string, magic_goes_here> m;
m.add<int>("a", 2);
m.add<std::string>("b", "black sheep");

int i = m.get<int>("a");
int j = m.get<int>("b"); // error!

데이터 유형으로 기본 클래스에 대한 포인터를 가질 수는 있지만 오히려 그렇지 않습니다.

나는 전에 Boost를 사용한 적이 없지만 Fusion 라이브러리를 보았지만 내가해야 할 일을 알 수는 없습니다.

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

도움이 되었습니까?

해결책

#include <map>
#include <string>
#include <iostream>
#include <boost/any.hpp>

int main()
{
    try
    {
        std::map<std::string, boost::any> m;
        m["a"]  = 2;
        m["b"]  = static_cast<char const *>("black sheep");

        int i = boost::any_cast<int>(m["a"]);
        std::cout << "I(" << i << ")\n";

        int j = boost::any_cast<int>(m["b"]); // throws exception
        std::cout << "J(" << j << ")\n";
    }
    catch(...)
    {
        std::cout << "Exception\n";
    }

}

다른 팁

어떻게 만들 수 있습니까?u003Cfavorite container> 다른 유형의 객체의?

당신은 할 수 없지만 당신은 그것을 잘 가짜 할 수 있습니다. C/C ++에서 모든 어레이는 균질합니다 (즉, 요소는 모두 동일한 유형입니다). 그러나 추가 간접 층을 사용하면 이기종 용기의 모양을 줄 수 있습니다 (이종 용기는 포함 된 물체가 다른 유형 인 용기입니다).

이기종 용기에는 두 가지가 있습니다.

첫 번째 사례는 컨테이너에 저장하려는 모든 객체가 공통 기본 클래스에서 공개적으로 파생 될 때 발생합니다. [...

두 번째 경우는 객체 유형이 분리 될 때 발생합니다. 공통 기본 클래스를 공유하지 않습니다.
여기서 접근 방식은 핸들 클래스를 사용하는 것입니다. 컨테이너는 핸들 객체의 컨테이너입니다 (값 또는 포인터에 따라 선택, 선택이 더 쉽습니다). 각 핸들 객체는 컨테이너에 넣을 객체 중 하나를 "잡고"(즉, 포인터를 유지하는) 방법을 알고 있습니다. 여러 다른 유형의 포인터가있는 단일 핸들 클래스를 인스턴스 데이터로 사용하거나 포함하려는 다양한 유형을 쉐도우하는 핸들 클래스의 계층 구조를 사용할 수 있습니다 (컨테이너는 핸들 기본 클래스 포인터의 컨테이너가 필요합니다). 이 접근법의 단점은 포함 할 수있는 유형 세트를 변경할 때마다 핸들 클래스 (ES)가 유지 보수를 열어야한다는 것입니다. 이점은 핸들 클래스를 사용하여 메모리 관리 및 객체 수명의 대부분의 추악함을 캡슐화 할 수 있다는 것입니다. 따라서 첫 번째 경우에도 핸들 객체를 사용하는 것이 유리할 수 있습니다.

일 것이다 부스트 :: 누구 당신을 위해 트릭을합니까?

데이비드 감사합니다. 그게 제가 필요한 것입니다. 작동 솔루션은 다음과 같습니다.

#include <iostream>
using std::cout;
using std::endl;

#include <map>
#include <boost/any.hpp>

using boost::any_cast;
typedef std::map<std::string, boost::any> t_map;


int main(int argc, char **argv)
{

  t_map map;
  char *pc = "boo yeah!";

  map["a"] = 2.1;
  map["b"] = pc;

  cout << "map contents" << endl;
  cout << any_cast<double>(map["a"]) << endl;
  cout << any_cast<char*>(map["b"]) << endl;

  return 0;
}

제한된 유형 세트를 지원하려면 부스트 트릭을해야합니다.

확실히 작동하지만 핵 유형의 퓨전 맵으로서 INT를 사용하여 기술을 입력하는 것이 더 나은 솔루션이라고 생각합니다. 유형 삭제가없고 더 빠릅니다

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