分层常量集
Hierarchical set of constants
我们有一个遗留的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::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; };
}
对于成千上万的人来说,这种方法感觉非常错误! 另一种解决方案可能是通过间接名称和查找函数执行动态部分:
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;
//
}
}
};
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- 分层常量集