문제

정수부터 튜플 세트에 이르기까지지도를 만들어야합니다. 단일 세트의 튜플은 크기가 동일합니다. 문제는 튜플의 크기와 매개 변수 유형이 컴파일 시간이 아닌 런타임에 결정될 수 있다는 것입니다. 나는 다음과 같은 것을 상상하고 있습니다.

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;

매개 변수 유형에 공통점이없는 경우 - 동일한 맵에 넣지 마십시오. 아마도 그들은 함께 속하지 않을 것입니다.

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