代码之家  ›  专栏  ›  技术社区  ›  Evg

类与枚举类作为索引类型

  •  5
  • Evg  · 技术社区  · 6 年前

    P0138R2 proposal 开始于

    enum class 具有显式指定的基础类型。例子:

    enum class Index : int { };    // Note: no enumerator.
    

    可以使用 Index

    转换 索引 对于其底层类型,定义

    int operator*(Index index) {
        return static_cast<int>(index);
    }
    

    另一种创造 索引 类型是使用旧的 class :

    class Index final {
    public:
         explicit Index(int index = 0) : index_(index) { }
    
         int operator*() const {
             return index_;
         }
    
    private:  
         int index_;
    };
    

    void bar(Index index) {
        std::cout << *index;
    }
    
    bar(Index{1});
    
    int i = 1;
    bar(Index{i});
    

    枚举类 枚举类 :默认值的索引值 枚举类

    这些备选方案之间还有其他实际区别吗?


    1. uint32_t int #include <cstdint>
    0 回复  |  直到 6 年前
        1
  •  1
  •   JVApen    4 年前

    NamedTypes https://www.fluentcpp.com/2016/12/08/strong-types-for-strong-interfaces/

    写得稍微冗长一点: using Index = NamedType<int, struct IndexTag, Comparable, ImplicitlyConvertibleTo<int>>;

    当你构造这个的时候,你需要写一些 Index{0} 但是,当您将它用作索引时,它应该自动转换为基础类型。

    它有几个优点,包括能够处理任何类型的问题。最大的缺点是它是一个必须导入的外部库,而不是内置的功能。