문제
균질 키 유형이지만 이기종 데이터 유형이있는 맵을 갖고 싶습니다.
나는 (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를 사용하여 기술을 입력하는 것이 더 나은 솔루션이라고 생각합니다. 유형 삭제가없고 더 빠릅니다