如何对嵌套模板多维数组进行类型转换

时间:2018-03-20 13:31:31

标签: c++ arrays templates multidimensional-array

我正在使用模板构建一个多维数组,但我遇到了类型转换为基类的问题。到目前为止,这是我的代码。

#include <memory>

struct A {
  int a;
};

struct B : A {
  int b;
};

template<typename T>
struct Array {
  std::shared_ptr<T> t;
  int length;
  T operator[](int x) {
    return t[x];
  }

  Array() {}

  template<typename T2>
  Array(Array<T2> o) {
    t = o.t;
    length = o.length;
  }
};


int main() {
  Array<B> b;

  Array<A> a = b;  //OK

  Array<Array<B>> bb;

  Array<Array<A>> aa = bb;  //Error

  return 0;
}

一维类型转换有效,但多维失败。

我得到的错误是

cannot convert 'Array<B>* const' to 'Array<A>*' in assignment

我错过了操作员或其他什么吗? 无论创建多少维度,我都需要能够发挥作用的东西。

为了清楚起见,Array类删除了很多函数,我只需要使用类型转换来工作。

注意:std :: shared_ptr :: operator []将需要C ++ 17。

感谢。

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个可能的解决方案:

#include <memory>

struct A {
  int a;
};

struct B : public A {
  int b;
};

template<typename T>
struct A1 {
  T **t;
  A1() {}
  T operator[](int idx) {
    return *t[idx];
  }
  template<typename T2>
  A1(A1<T2>* o) {
    t = (T*)o->t;
  }
  template<typename T2>
  A1(A1<T2> o) {
    t = (T*)o.t;
  }
};

template<typename T>
struct A2 {
  A1<T> *t;
  A2() {}
  A1<T> operator[](int idx) {
    return t[idx];
  }
  template<typename T2>
  A2(A2<T2>* o) {
    t = (A1<T>*)o->t;
  }
  template<typename T2>
  A2(A2<T2> o) {
    t = (A1<T>*)o.t;
  }
};

template<typename T>
struct A3 {
  A2<T> *t;
  A3() {}
  A2<T> operator[](int idx) {
    return t[idx];
  }
  template<typename T2>
  A3(A3<T2>* o) {
    t = (A2<T>*)o->t;
  }
  template<typename T2>
  A3(A3<T2> o) {
    t = (A2<T>*)o.t;
  }
};

int main() {
  A3<B> b3;
  A3<A> a3 = b3;
  A2<A> a2_ = b3[5];

  A2<A> a2 = a3[1];

  A a = a3[5][2][1];

  A3<int> i1;

  return 0;
}

每个维度需要一个类,但我从不需要超过3个级别。这允许所需的类型转换,使用指针数组,因此使用基类应该可以工作。