【问题标题】:What is a convenient way to define a class with a static 2d array (and the size of the 2d array is known only during compile time)?用静态二维数组定义类的便捷方法是什么(二维数组的大小仅在编译时才知道)?
【发布时间】:2012-02-25 10:04:40
【问题描述】:

下面的示例代码显示了我正在尝试做的事情:

template<int NX, int NY>
class Array
{
public:
  float v[NX][NY];
};

void main()
{
  Array<10,20> grid;
}

上面的代码不会编译,但它显示了我想要做什么。我们有一个包含数组的类,而数组类直到编译时才知道它的大小。有没有简单的方法来做到这一点?

编辑:我想写一个简单的可重用数组类。这意味着我需要找到一种将数组大小与类分开的好方法。

我还希望该类快速(且简单),因此不能动态分配。这意味着在运行时无法给出大小。

我也不想使用预处理器来定义大小,因为这意味着我将不得不经历在某处更改数字的麻烦。这还不够方便。

基本上,类直到编译时才知道自己的大小,因为那是主函数告诉类它的大小的时候。

编辑:上面的代码很好。

【问题讨论】:

  • 无法编译的唯一原因是main 必须返回int——除此之外,它是合法代码。 codepad.org/xKxBH2tJ
  • 另外,“直到编译时”没有什么意义——还有什么更早的时间?

标签: c++ arrays templates multidimensional-array


【解决方案1】:

Boost.MultiArray 可能适合您的需求。

【讨论】:

    【解决方案2】:

    除了main 不返回int 之外,这是合法代码并且应该编译。事实上,在某些编译器上,这将在没有 main 返回 int 的情况下进行编译,例如 VC++ 但 this is non-standard behaviour。

    您还可以在编译时存储大小,这样您就不必手动计算它。

    #include <iostream>
    
    template<int NX, int NY>
    class Array
    {
    public:
      float v[NX][NY];
    
      int size() const { return ArraySize; }
    
    private:
      enum { ArraySize = NX * NY }; // You can also store rows/cols individually
    };
    
    int main()
    {
      Array<10,20> grid;
    
      std::cout << grid.size();
    
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多