0

我们有一个遗留的 C++ DB 应用程序,我将在这里过度简化:十多个非常宽的 DB 表代表部分相似类型的数据,因此列中有一些重叠。架构每隔几个月只会稍微更改一次,但它的接口是动态的,其中 table_name.column_name 被查找并由 ID 表示。当我们处理内存中的数据时,它们都在一个列表中,每个字段都有其关联的 ID。

这很好用,但寻址数据很混乱。我们有一个基于字符串get_ID( type_A1, "title" )(我想生成与字符串相对应的符号名称,以便可以在编译时查找其中的大部分内容。我天真的想法是这样的:

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::bbb也可以是B1::aaa我们知道我们正在处理的类型的地方,或者:

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

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

对于成千上万的 consts,这种方法感觉非常错误!另一种解决方案可能是通过间接名称和查找函数执行动态部分:

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

这意味着所有标识符都有两个变体——丑陋!有人有干净、直观和节省空间的解决方案吗?

4

1 回答 1

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;
      //
    }
  }
}; 
于 2013-09-12T11:16:02.517 回答