代码之家  ›  专栏  ›  技术社区  ›  Przemysław Czechowski

访问向量字段的键-枚举类或命名空间中的枚举?

  •  1
  • Przemysław Czechowski  · 技术社区  · 7 年前

    假设向量有一个别名:

    typedef std::vector<double> PlanetData;
    

    我希望它的字段可以通过一些键访问:

    double x = planet_data[PlanetDataKeys::PosX]; //planet_data is of type PlanetData
    

    我可以在命名空间内定义枚举:

    namespace PlanetDataKeys {
      enum {
        PosX = 0,
        PosY = 1
      };
    }
    

    enum class 更安全:

    enum class PlanetDataKeys {
      PosX = 0,
      PosY = 1
    };
    

    然而,作为 int 类型已禁用,这将需要写入:

    double x =  planet_data[static_cast<int>(PlanetDataKeys::PosX)];
    

    这有点尴尬。

    在这种情况下,哪种方法更好?为什么?

    在实际代码中,PlanetData有7个字段,如果我决定扩展它,可能会更多。我在解析一个字符串的时候创建了一个实例 data_string = "date: 2903248.12343, position=[124543254.1343214,123213.12341,63456.1234], velocity=[..." 这就是为什么我希望它是一个向量:使用类似 planet_data.push_back(ParseNextDouble(data_string));

    2 回复  |  直到 7 年前
        1
  •  2
  •   Sergey    7 年前

    请不要期望一个简单的向量有太多的功能。

    Vector的设计目的不是使用索引以外的键访问其数据。尽管你的例子在语法和语义上都是正确的,但它们看起来像是对 std::vector

    引入枚举类以提高类型安全性。有了他们,你永远不会搞混 PlanetDataKeys , SatelliteEphemeris KeplerianOrbitElements

    对我来说,最好定义一个 PlanetData 平面基准

        2
  •  0
  •   virgesmith    7 年前

    那么,只定义适当类型的作用域常量怎么样,比如:

    namespace PlanetDataKeys {
      const size_t PosX = 0;
      const size_t PosY = 1;
    }