2009-03-01 4 views
0

나는 식별자 < => 구조체 쌍의 정적지도가 있고 각 구조체에는 배열이 포함되어야합니다. 컴파일 타임에는 모든 것이 알려져 있습니다. 즉, 여기에 이와 같은 것을 갖고 싶습니다 :가변 길이의 배열을 사용하여 구조체를 정적으로 초기화

ID1 => name: someString 
     flagCount: 3 
     flags: [1, 5, 10] 

(가능한 경우). 물론, 같은 선언 :

struct Info 
{ 
    const char* name; 
    int flagCount; 
    int flags[]; 
}; 

... 나는 제외 (때문에 다양한 길이 배열에, 수 없습니다

Info infos [] = { ... }; 

내가 좋아 초기화 할 수있는 한, 이상적 일 것이다 뭔가 빠졌어요). 양자 택일로, 나는 약 (ab) boost::assign 이것을 사용하지만, 거기에 권장되는 해결책이 있는지 궁금하네요. 배열에 정보 구조체 만 저장할 수 있고 매핑을 다른 곳에 저장할 수 있다면 괜찮습니다.

편집 : 현재 해결 방법에 대한 메모입니다. 지금이 순간, 내가 가진 :

struct Info 
{ 
    Info (const std::vector<int>& flags) : flags {} 
    std::vector<int> flags; 
}; 

내가 사용 (? 템플릿 기반)

작동
const std::map<ID, Info> map = boost::assign::map_list_of 
    ("ID1", Info (boost::assign::list_of (1)(2)(3)); 

, 나는 간단한 해결책이 있는지 그냥 궁금 해요.

+0

컴파일 타임에 배열의 각 Info 오브젝트에 대한 플래그 배열의 길이를 알고 계십니까? – dirkgently

+0

예. 그러나 다른 Infos에서는 다릅니다. – Anteru

답변

1

배열의 요소 크기가 서로 같아야합니다. 그렇지 않으면 infos[i]을 사용할 수 없습니다. 컴파일러는 배열을 단계별로 실행하고 각 요소의 크기를 최대 i까지 확인해야합니다. 다음 위치가 시작된 곳을 찾습니다. 각 요소에 대해 충분한 메모리를 연속적으로 할당 한 다음 요소에 대한 포인터의 배열을 만들 수 있습니다 (포인터는 고정 된 크기 임). 정보 만 색인화하고 색인을 작성하지 않으려면지도가 포인터의 식별자가됩니다.

또는 컴파일 시간에 크기를 알 수있을 때 플래그가 몇 개 밖에없는 경우 Info::flags 배열을 최대 플래그에 충분히 크게 만들거나 플래그 배열에 대한 포인터로 지정하여 Info가 고정 크기 구조체.

+0

합리적인데, 나는 boost :: mpl :: vector와 같은 것을 사용하고, 타입 자체로 정보를 옮겨서, 컴파일 타임에 가변 길이 원소를 가진 "배열"을 만들 수 있다고 확신한다. – Anteru

1

어느 가변 길이 배열에 대한 포인터를 사용 : 충분히 큰

struct Info 
{ 
    const char* name; 
    int flagCount; 
    int *flags; 
}; 

또는 고정 크기 배열을 모든 플래그 개최 : 두 솔루션은 일부 메모리를 낭비

struct Info 
{ 
    const char* name; 
    int flagCount; 
    int flags[MAX_FLAGS]; 
}; 

을; 하지만 솔루션 1에서는 구조체 당 하나의 포인터 일뿐입니다. 이미 이름 필드에 대해이 솔루션을 암시 적으로 사용하고 있습니다.

1

여러분이해온대로 벡터를 사용하는 것이 가장 좋은 해결책입니다. oefe는 Info 자체에 간접 지정을 포함하는 해결책을 제공했으며, 또 다른 옵션은 map<ID, Info*> (또는 사용자가 부스트 map<ID, shared_ptr<Info> >을 사용하고 있으므로)지도에서 간접적으로 정보를 정의하는 것입니다. 실제로 이것을하지 마십시오. 벡터를 사용하십시오. 최고의 솔루션입니다.

struct Info { 
    const char *name; 
    int flagCount; 
    int flags[1]; // this is cheating... 
}; 

Info* make_info(int count) { 
     char *buf = new char[sizeof(Info) + (sizeof(int) * (count - 1))]; 
     Info *rv = static_cast<Info*>(static_cast<void*>(buf)); 
     rv->flagCount = count; 
} 
관련 문제