2009-03-01 74 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对象的flags数组的长度? – dirkgently 2009-03-01 11:41:10

+0

是的。但是,对于不同的信息它是不同的。 – Anteru 2009-03-01 13:14:11

回答

1

数组中的元素必须是相同的大小,否则您不能使用infos[i]来访问它们 - 编译器必须遍历数组,并查看每个元素的大小,最大为i找到下一个开始的地方。您可以为每个元素连续分配足够的内存,然后创建一个指向元素的指针数组(指针为固定大小)。如果你只需要映射而不是索引信息,那么你的映射就会成为指针的标识符。另外,正如你知道编译时的大小,如果只有几个标志,使Info::flags数组足够大的最大标志,或使它成为一个标志数组的指针,以便Info是一个固定大小的结构。

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*>(或者因为您正在使用boost map<ID, shared_ptr<Info> >)并定义Info like。其实不要这样做。使用矢量。这是最好的解决方案。

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; 
}