隐式数组传递/创建

时间:2016-05-03 01:54:20

标签: c++ arrays templates initialization

我意识到这可能是不可能的,但我会问任何方式。

假设我有一个班级:

class A{
  int* array;
 public:
  //To be clear this class has other members
  constexpr int GetSize() { return 10; /*actually this could be a little more than this*/ }
  A(int arr[GetSize()]) : array(arr) { }
};

我应该这样声明:

int array[A::GetSize()] = { 0 };
A var(array);

但是我很懒,希望它被视为我根本没有声明数组......就像这样:

A var;

有没有办法实现这个目标?

一些限制:

  • 没有动态内存分配(这是针对微控制器的)
  • 在编译之前我不知道数组的实际大小
  • 魔术数组是从sizeof(A)派生的,所以我不能在类中包含数组,因为在确定数组大小之后才能确定sizeof(A)(需要知道{{} 1}})
  • sizeof(A)类必须能够放入模板并以这种方式初始化(​​这是主要约束)示例:

    A

2 个答案:

答案 0 :(得分:1)

这听起来很像你想要的(至少相当于):

using A = std::array<int, size>;

A var;

这绝对符合你的前两个限制。我无法弄清楚你的第三个限制是什么意思。您当然可以将array类型的对象放入模板中,但当您说:&#34;并初始化该方式时,它并不清楚您正在谈论的内容&#34;。这可以像普通数组一样初始化,所以A var = {0};会很好,如果这就是你的意思。

请注意,尽管在C ++ 11中添加了std::array,但只能使用C ++ 98功能来编写合理的类似内容(例如,TR1包含array类型的&#39}。与C ++ 98/03编译器基本相似且兼容。)

答案 1 :(得分:0)

class B
{
  friend class A;
  int a, b, c; //Whatever you want here
};

class A : public B
{
  int array[(sizeof B)];
public:
  static constexpr int length = (sizeof B) + (sizeof int) * (sizeof B);
};