我们有一个遗留的 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]; };
}
这意味着所有标识符都有两个变体——丑陋!有人有干净、直观和节省空间的解决方案吗?