Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分层常数集 我们有一个传统的C++数据库应用程序,这里我将过于简化:十几个非常宽的DB表代表了部分相似的数据,因此在列中有一些重叠。模式每隔几个月只会发生轻微变化,但它的接口是动态的,在这里,会查找table_name.column_name并用一个ID表示。当我们处理内存中的数据时,所有数据都在一个列表中,每个字段都有相关的ID_C++ - Fatal编程技术网

分层常数集 我们有一个传统的C++数据库应用程序,这里我将过于简化:十几个非常宽的DB表代表了部分相似的数据,因此在列中有一些重叠。模式每隔几个月只会发生轻微变化,但它的接口是动态的,在这里,会查找table_name.column_name并用一个ID表示。当我们处理内存中的数据时,所有数据都在一个列表中,每个字段都有相关的ID

分层常数集 我们有一个传统的C++数据库应用程序,这里我将过于简化:十几个非常宽的DB表代表了部分相似的数据,因此在列中有一些重叠。模式每隔几个月只会发生轻微变化,但它的接口是动态的,在这里,会查找table_name.column_name并用一个ID表示。当我们处理内存中的数据时,所有数据都在一个列表中,每个字段都有相关的ID,c++,C++,这很有效,但寻址数据很混乱。我们有一个基于字符串的ID查找函数(get\u ID(type\u A1,“title”)),当我们有处理特定类型的代码时,同事们倾向于按字面意思编写ID。我希望生成与字符串对应的符号名,以便在编译时可以查找其中的大部分内容。我天真的想法是: struct ANY{ 虚常数int 标题、aaa、bbb、ccc、ddd;/。。。 } 结构A1:任何{ 常数整数 头衔=17,aaa=29,bbb=5,ddd=27; } 结构B1:任何{ 常数整数 标题=71,aaa=92

这很有效,但寻址数据很混乱。我们有一个基于字符串的ID查找函数(
get\u ID(type\u A1,“title”)
),当我们有处理特定类型的代码时,同事们倾向于按字面意思编写ID。我希望生成与字符串对应的符号名,以便在编译时可以查找其中的大部分内容。我天真的想法是:

struct ANY{
虚常数int
标题、aaa、bbb、ccc、ddd;/。。。
}
结构A1:任何{
常数整数
头衔=17,aaa=29,bbb=5,ddd=27;
}
结构B1:任何{
常数整数
标题=71,aaa=92,ccc=45;
}
使用方法可以是直接
A1::bbb
B1::aaa
,我们知道要处理的类型,或者:

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

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

struct ANY{
虚拟int get_title()常量=0;
虚拟整数get_aaa()常量=0;
}
结构B1:任何{
常数整数
标题=71,aaa=92,ccc=45;
int get_title()常量{return title;};
int get_aaa()常量{return aaa;};
}
对于数千个常量,这种方法感觉非常错误!另一种解决方案可能是通过间接名称和查找函数执行动态部分:

enum名称{title\u name、aaa\u name、bbb\u name、ccc\u name};
构造任何{
虚拟int get(names)const=0;
}
结构B1:任何{
常数整数
标题=71,aaa=92,ccc=45;
静态常量int[]my_consts={title,aaa,-1,ccc};//伪代码
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;
      //
    }
  }
}; 

方法方法对我来说似乎是正确的。无论如何,成千上万的常量“感觉非常错误”,不管你是否使用()。我越来越喜欢这种方法。特别是通过使方法常量,编译器应该在
a1.get(title)中优化它
给定的
常量A1
。我的一个担忧是,枚举可以分配给int,因此有人可能会意外地使用它,而不是获取实数。给
标题
一个在
开关
中可用时仅用作
获取
参数的类型的最佳方式是什么?@Daniel:谢谢!Alas我们仍然必须部署到旧的机器上,而C++11不是一个选项:-(好吧,这是一个明确的信息:“我们有一个可行的解决方案,但由于机器的年龄,它是不安全的。”。让权力决定他们认为什么是重要的。我发现了这个解决方案的一个主要缺点:我已经验证过,给定一个常量参数,优化器会将方法结果转换为编译时常量。唉,这还不足以使它成为一个“常量表达式”,所以它在很多地方都不可用(如大小写标签)。