문제
정수부터 튜플 세트에 이르기까지지도를 만들어야합니다. 단일 세트의 튜플은 크기가 동일합니다. 문제는 튜플의 크기와 매개 변수 유형이 컴파일 시간이 아닌 런타임에 결정될 수 있다는 것입니다. 나는 다음과 같은 것을 상상하고 있습니다.
std::map<int, std::set<boost::tuple> >
그러나이 작업을 정확하게 수행하는 방법을 완전히 확신하지 못하고 포인터를 사용합니다.
이것의 목적은 각각 고유 식별자 (키)를 가진 임시 관계 (테이블)를 만드는 것입니다. 아마도 다른 접근법이있을 수 있습니다.
해결책
목적 boost::tuple
임의 유형을 혼합하는 것입니다. 당신이 말했듯이
나는 정수 만 삽입하고 있습니다
그런 다음 사용해야합니다 map< int, set< vector< int > > >
. (내가 당신이라면, 나는 약간 던질 것입니다 typedef
그것에 s.)
그래도 원래 질문에 대답하기 위해 boost::tuple
런타임에 임의 유형을 허용하지 않습니다. boost::any
하다. 하지만, any
비교를 지원하지 않으므로 set
.
typedef vector< boost::any > tuple;
struct compare_tuple { bool operator()( tuple const &l, tuple const &r ) const {
assert ( l.size() == r.size() );
for ( tuple::iterator lit = l.begin(), rit = r.begin();
lit != l.end(); ++ lit, ++ rit ) {
assert ( lit->type() == rit->type() );
if ( lit->type() == typeid( foo ) ) { // find the type and perform "<"
return boost::any_cast<foo>(*lit) < boost::any_cast<foo>(*rit);
} else if ( lit->type() == typeid( bar ) ) {
return boost::any_cast<bar>(*lit) < boost::any_cast<bar>(*rit);
} /* etc; you will need to enumerate all the types you can insert */
}
} };
typedef std::map< int, std::set< tuple, compare_tuple > > main_map;
다른 팁
현대의 부수적 노트 (이전 답변이 2010 년경)로서 오늘날의 변동 템플릿은 다음과 같은 유용 할 것입니다.
template<typename... Args> //Accept any number of arguments and types
auto MyFunction(std::tuple<Args...> &T)->void
{
//Do stuff...
}
공통 기본 클래스가있는 경우 이러한 다른 세트를 동일한 컬렉션에만 저장할 수 있습니다. 추상 인터페이스를 작성한 다음 각 종류의 테이블/튜플에 대해이를 구현할 수 있습니다. 문제는 일반적으로 그러한 인터페이스가 매우 지저분한 경향이 있다는 것입니다. 많은 유형의 테이블/튜플이 있으면 클래스 폭발이있을 수 있습니다. boost.any 이러한 인터페이스에 유용 할 수 있습니다 (다른 데이터 유형을 동적으로 처리해야하므로).
매개 변수 유형에 공통점이있는 경우이를 추상적 인 기본 클래스로 캡처하고 튜플 에이 기본 클래스에 포인터를 포함하십시오.
class MyParamBase {
public:
virtual int getFoo() = 0;
virtual void setFoo(int) = 0;
};
std::map<int, std::set<MyParamBase*> > container;
(부스트 :: 튜플이 간결하게 생략되었습니다. 왜 튜플 세트가 필요한지 잘 모르겠습니다.)
그런 다음 MyParamBase에서 콘크리트 매개 변수 유형을 도출하여지도에 작성하여 삽입 할 수 있습니다.
class SomeParam: MyParamBase {
public:
virtual int getFoo() { ... }
virtual void setFoo(int a) { ... }
};
std::set<MyParamBase*> some_set;
some_set.insert(new SomeParam());
container[123] = some_set;
매개 변수 유형에 공통점이없는 경우 - 동일한 맵에 넣지 마십시오. 아마도 그들은 함께 속하지 않을 것입니다.