繁体   English   中英

如何从枚举模板参数中推导出数组大小?

[英]How to deduce array size from an enum template argument?

我应该如何更改下面的代码,以便Array<Index> array; 足够了, SIZE会自动从枚举中推断出来吗?
即使枚举更改,也可以保证它包含指向正确大小的SIZE

template <typename Enum, int N>
class Array {

public:
    int& operator[](Enum index) { return array[index]; }

private:
    int array[N];
};

enum Index { X, Y, SIZE };

int main() {

    Array<Index, SIZE> array;

    array[X] = 1;

    return 0;
}

更新:至于“Array <type>意味着你正在创建一个Type对象数组”(Jerry)和“类模板的名称有点误导”(Nawaz):实际上我正在创建CustomSqlQueryModel <TableColumns>。 以上只是一个简化的代码,仅此而已。 Jerry和Nawaz很严格:这个简化的代码很不幸。

你可以写一个特质类。 每次定义新的枚举类型时,这需要一些额外的工作,但在用户代码中每次出现的Array <Index>都没有额外的工作:

template<class Enum>
struct ArrayTraits;

template<class Enum>
struct Array {
  int& operator[](Enum index) { return array[index]; }

private:
  int array[ArrayTraits<Enum>::size];
};

enum Index { X, Y, SIZE };

template<>
struct ArrayTraits<Index> {
  enum { size = SIZE };
};


int main() {
  Array<Index> array;
  array[X] = 1;
  return 0;
}

这样做的一个优点是,只要您知道如何获得最大尺寸,就可以专门设置您无法控制的外部枚举的特征。

如上所述,我认为你不能。 但是,如果您将其更改为:

struct Index { 
    enum { X, Y, SIZE};
};

然后你的模板可能是这样的:

template <class Enum>
class Array { 
// ...

private:
    int array[Enum::SIZE];
};

...如果作为Enum传递的类型不包含一些名为SIZE ,则实例化将不会编译。 出于目的,你真的更喜欢Index是命名空间,但由于命名空间不是类型,我认为你不能将它用作模板参数。

但是,我应该补充一点,我不确定我是否喜欢这个想法 - 大多数人都会认为Array<type>意味着你正在创建一个Type对象数组,这显然与那个完全不同...

如果你只想要大小是模板参数,而不是类型 ,从你的例子看,数组的类型似乎总是int ,那你为什么不实现这个:

template <int size>
class Array {

public:
    int& operator[](int index) { return array[index]; }

    //Note this addition!
    int operator[](int index) const { return array[index]; }
private:
    int array[size];
};

int main() {

    Array<10> array;

    array[0] = 1;
    array[1] = 2;

    return 0;
}

注意这个补充:如果你也实现了const operator[] const版本,那么const Array<>可以使用它来访问数组元素,否则你的类不适用于const Array<>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM