分层常量集

Hierarchical set of constants

本文关键字:常量 分层      更新时间:2023-10-16

我们有一个遗留的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;

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

这意味着将所有标识符放在两个变体中 - 丑陋! 是否有人拥有干净、直观和节省空间的解决方案?

枚举可能是更好的主意。

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