【问题标题】:how to typecast nested template multi dimensional array如何对嵌套模板多维数组进行类型转换
【发布时间】:2018-08-29 08:23:49
【问题描述】:

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

#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。

谢谢。

【问题讨论】:

  • 从不转换为基类
  • 这看起来坏了。首先,共享指针应该是std::shared_ptr&lt;T[]&gt; 来保存一个数组。但是,尝试使用指向基对象的指针来索引派生对象数组是行不通的。
  • 代码审查:t = o.t 不会复制该值,它只是对相同的值进行另一个引用。 (因为t的类型是std::shared_ptr
  • @Quentin - C++17 不需要。
  • @PeterQuiring 是的,这就是我的意思。当然,您可以重载足够多的运算符,使其编译并且看起来很有意义,但是您的核心功能无法工作,因为您最终试图索引具有错误类型的数组。

标签: c++ arrays templates multidimensional-array


【解决方案1】:

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

#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 个级别。这允许所需的类型转换,使用指针数组,因此使用基类应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多