分层常量集

时间:2013-09-12 10:13:20

标签: c++

我们有一个传统的C ++数据库应用程序,我在这里只是过于简单化了:十几个非常宽的数据库表代表了部分类似的数据类型,所以列中有一些重叠。模式每隔几个月只会稍微更改一次,但它的接口是动态的,其中table_name.column_name被查找并由ID表示。当我们处理内存中的数据时,它都在一个列表中,每个字段都与其ID相关联。

这很好用,但解决数据很麻烦。我们有一个基于字符串(get_ID( type_A1, "title" ))的ID查找功能,并且我们有处理特定类型的代码,同事倾向于按字面编写ID。我想生成与字符串对应的符号名称,这样可以在编译时查找大部分内容。我天真的想法就像:

struct ANY {
    virtual const int
        title, aaa, bbb, ccc, ddd; // ...
}

struct A1 : ANY {
    const int
        title=17, aaa=29, bbb=5, ddd=27;
}

struct B1 : ANY {
    const int
        title=71, aaa=92, ccc=45;
}

使用方式可以是直接A1::bbbB1::aaa,我们知道我们正在处理哪种类型,或者:

const ANY& any = determine_type();
int title_id = any.title;

Alas C ++不允许这样做,只有方法可以是虚拟的。 :-(一种解决方案可能是将它们包装在方法中:

struct ANY {
    virtual int get_title() const = 0;
    virtual int get_aaa() const = 0;
}

struct B1 : ANY {
    const int
        title=71, aaa=92, ccc=45;
    int get_title() const { return title; };
    int get_aaa() const { return aaa; };
}

对于成千上万的竞争对手来说,这种做法错了!另一个解决方案可能是通过间接名称和查找功能来执行动态部分:

enum names { title_name, aaa_name, bbb_name, ccc_name };

struct ANY {
    virtual int get( names ) const = 0;
}

struct B1 : ANY {
    const int
        title=71, aaa=92, ccc=45;
    static const int[] my_consts = { title, aaa, -1, ccc }; // pseudo code
    int get( names n ) const { return my_consts[n]; };
}

这意味着拥有两个变体的所有标识符 - 丑陋!有没有人有一个干净,直观和节省空间的解决方案?

1 个答案:

答案 0 :(得分:1)

枚举可能是更好的主意。

enum fields { title, aaa, bbb, ccc };

struct ANY {
  virtual int get(field f);
}; 

struct A1 : public ANY {
  virtual int get(field f) {
    switch (f) {
      case title : return 71;
      //
    }
  }
};