非pod结构的查找表

时间:2011-12-30 03:38:04

标签: c++ arrays structure

有关于下面设计的c ++代码片段的两部分问题:

 namespace {

  struct FieldRecord {

     string item_to_fieldname;
     bool is_queriable;
   };

   const FieldRecord g_LookUpTable [] = {

       {"employee_name", true},
       { "ssn_no", false},
        //etc 
   };

 }

1)如果我想实现一个非-pod结构的查找表,则下面的C样式方法容易出错,或者是否需要使结构FieldRecord成为pod,即用const char * etc替换字符串

2)上述结构中数组的FieldRecord结构是如何从初始化列表初始化的,因为我只有一个默认的构造函数。

2 个答案:

答案 0 :(得分:2)

您的代码运行正常。对结构进行初始化按照惯例进行:每个元素的每个数据成员都是从相应的参数构造的,从string构造char*完全有效。

答案 1 :(得分:1)

您的FieldRecord不是POD。然而,它是一个聚合。要使用直接初始化,就可以使用聚合。如果您的类型变为非聚合,则需要使用构造函数。对于聚合,您只需列出相应成员应获得的值,它们将直接初始化,可能涉及成员的转换。

然后问题变成:什么是聚合?好吧,它是任何既没有构造函数也没有析构函数的类,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数。如果你需要其中任何一个,你需要给你的类型一个构造函数并从那里构造。它有点重复,但您仍然可以使用这些对象填充数组。例如:

std::pair<std::string, bool> const table[] = {
    std::pair<std::string, bool>("employee_name", true),
    std::pair<std::string, bool>("ssn_no", false)
};