【问题标题】:Can array elements have identifiers?数组元素可以有标识符吗?
【发布时间】:2016-01-07 07:11:11
【问题描述】:

我目前正在定义一些常量:

struct ModInfo {
    int numChoices;
    string menu;

    ModInfo (int count, string menuText) : numChoices(count), menu(menuText) {
    }
};

const ModInfo menus[4] = {ModInfo(3, "..."), ModInfo(7, "...", ...};

每个ModInfo 都包含一个模块的信息,main() 将使用该模块将菜单打印到显示器和流程控制,以确定要打印哪个模块的菜单以及随后执行其中的哪个功能。

除了通过数组索引访问数组元素内的模块信息之外,我可以为该元素分配一个标识符(即模块的名称)吗?有没有直接的方法可以做到这一点,或者enum 是唯一可以做到这一点的黑客吗?

编辑:请停止在我提出的每个问题中要求我使用 C++11。如果可以的话我会的。

【问题讨论】:

  • 我标记为 C++03。如果您仅限于使用 C++11 之前的方言,则应使用此标记。
  • 错误的术语:标识符通常是指源代码中的标记。
  • @BasileStarynkevitch 这不是错误的术语。我在问是否可以在开发过程中将数组元素映射到标识符,而不是将保留在构建中的字符串值。
  • @thegreatjedi:如果您想使用标识符,那么我不明白为什么枚举是一个黑客。您能否在问题中包含一些描述您想要做什么的伪代码?
  • 让模块标识符成为实际的 C++ 标识符(例如常量)是否足够,或者您是否需要可以在运行时指定的内容,例如一个字符串?

标签: c++ arrays initialization identifier c++03


【解决方案1】:

enum 不是黑客,而是适合您用例的正确工具。

【讨论】:

    【解决方案2】:

    您可以使用X macro 设置您的阵列:

    #define MODULES \
      X(MenuItemA, 24, "some menu text") \
      X(AnotherMenuItem, 99, "here's another menu item" )
    

    然后,您可以通过适当地定义X 来定义菜单数组以及具有来自同一个表的描述性常量的枚举:

    #define X(id, count, text) ModInfo(count, #text),
    const ModInfo menus[] = {
      MODULES,
      ModInfo(-1, "")
    };
    #undef X
    
    #define X(id, count, text) id,
    struct ModuleId {
       enum Value {
    MODULES
       };
    };
    #undef X
    

    然后您可以通过例如访问您的模块信息

    menus[ModuleId::AnotherMenuItem].text;
    

    【讨论】:

      【解决方案3】:

      请使用 C++11(甚至可以作为标签)。您可能会使用一些最新版本的GCCClang/LLVM(可能通过从其源代码编译编译器),两者都是free software

      C++11 之前的 C++ 版本已过时;当前标准是 C++14;如果您需要旧版本的 C++,您应该适当地标记您的问题)

      您应该了解 C++ containerssmart pointers,并且可以使用 std::map<std::string,std::unique_ptr<ModInfo>> 将指向您的 ModInfo 的指针关联到某些(名称)字符串

      读一本关于Programming using C++的好书;顺便说一句,阅读 SICP 并练习一些 Scheme 不会有害。

      【讨论】:

      • C++11 在我的环境中不可用。其次,我不是在寻找一种将字符串映射到元素的方法。我正在寻找一种将标识符(变量名)映射到元素的方法。
      • 然后将你的编译器升级到更新的版本。
      • 升级不是一种选择。版本由组织确定,并且必须遵循合作机构设定的约定。
      • @BasileStarynkevitch 我根本不明白为什么需要 C++11(因为我根本不明白为什么需要 unique_ptr。)
      • @thegreatjedi 因为 C++ 现在是 C++14,它包含了 C++11 的功能。
      【解决方案4】:

      如果数组的大小不太大,那么带有命名字段的结构可能会更方便。

      struct MyNamedStruct
      {
          int NamedVariable1;
          int NamedVariable2;
          ...
          int NamedVariableX;
      };
      
      MyNamedStruct a;
      ...
      a.NamedVariable1 = 10;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-10
        • 2015-06-08
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        相关资源
        最近更新 更多