2010-08-15 3 views
3

죄송합니다. 제목에 더 구체적으로 답할 수 없습니다.부스트 Multi_Index 질문

의 내가 클래스 푸에게

class Foo { 
public: 
    Foo() { m_bitset.reset(); } 

    void set_i(int i) { 
     m_bitset.set(1); 
     m_i = i; 
    } 

    void set_j(int j) { 
     m_bitset.set(2); 
     m_j = j; 
    } 
    bool i_set() { return m_bitset(1); } 
    bool j_set() { return m_bitset(2); } 
    void clear_i() { m_bitset.reset(1); } 
    void clear_j() { m_bitset.reset(2); } 
    int get_i() { 
     assert(i_set()); 
     return m_i; 
    } 
    int get_j() { 
     assert(j_set()); 
     return m_j; 
    } 

private: 
    int m_i, m_j; 
    bitset<2> m_bitset; 
}; 

이 그리고 지금은 푸의가 multi_index에 투입하기를 원하는 경우를 생각 해보자.

typedef multi_index_container < 
    Foo, 
    indexed_by< 
     ordered_non_unique<BOOST_MULTI_INDEX_CONST_MEM_FUN(Foo, int, get_i) 
     >, 
     ordered_non_unique<BOOST_MULTI_INDEX_CONST_MEM_FUN(Foo, int, get_j) 
     > 
    > 
> Foo_set; 

은 내가 알아 내기 위해 노력하고하는 것은 composite_key의 경우 I 또는 J (또는 둘 다의 유효한 값을 가지고 푸의 나머지를 건너 내 multi_index 종류가하는 방법입니다. 그래서 난 그냥 단지 내가 유효 값이 FOOS을 반환하려면, 아래의 코드를 폭파하고 싶지 않아요.

for (Foo_set::nth_index<1>::type::iterator it = foos.get<1>().begin(); it != foos.get<1>().end(); ++it) 
    cout << *it; 

답변

1

을 부스트 multi_index 라이브러리 문서를 통해 감추고에서 당신이 아닌 원하는 것을 말할 것 이 라이브러리에서 가능합니다 .을 보면 모든 "특성 항목"에 대해 완전히 인덱싱 가능한 요소를 인덱싱하는 경우에만 나타납니다. "스파 스"색인 크기를 허용하는 해킹이있는 경우 사용자 메일 링리스트를 요청할 수 있습니다.)

어쨌든 - 문제의 정확한 특성에 따라 부스트를 사용하여 해결할 수 있습니다. : 색인 유형으로 선택 사항.

+0

예, 'boost :: optional'을 사용하여 색인을 생성 할 수 있어야합니다. – alfC

1

multi_index 색인에 대한 i 또는 j 값을 요청할 때 하드 프로그램 중지의 원인이됩니다 get_i()get_j() 기능에 assert()를 갖는 (나는 그것이 부스트 :: 선택 사양.에 의해 색인을 가능성도 모르겠습니다 만).

Null Object Pattern 동작을 원하는 것처럼 들립니다. 나는. m_im_j은 설정되지 않았 음을 나타 내기 위해 특별한 값을 갖는 데이터 유형입니다 (포인터 인 경우 NULL 포인터가이 용도로 사용됩니다). 그런 다음 다중 색인은 해당 값에 대해 색인을 생성하여 모든 null 값을 함께 묶을 수 있습니다.

데이터에 액세스 할 때, 당신은 null 값 필터링 boost::range을 사용할 수 있습니다 : 당신이 당신의 변수의 값 공간을 오염하지 않으려면 의미있는 널 값이없는 즉, (

// Predicate for null testing 
struct is_not_null { 
    bool operator()(const Foo& f) { return f.get_i() != NULL && f.get_j() != NULL; } 
}; 

Foo_set::nth_index<1>::type& idx = foos.get<1>(); 
BOOST_FOREACH(const Foo& f, idx | filtered(is_not_null())) { 
    ;// do something with the non-null Foo's 
} 

을 저장 될 수 있음), m_im_j 명의 회원을 boost::optional 님의 것으로 변환하는 방법도 살펴볼 수 있습니다. 좀 더 functor 줄 바꿈을하면 <bool, int>의 합성 색인을 만들 수 있습니다.이 집합을 사용하면 Foo을 별도로 설정하거나 해제 할 수 있습니다. ij을 조합하여 <bool, bool, int, int>과 같은 복합 색인을 조합하여 색인을 작성할 수 있습니다.