c++ - 如何使用大小未知的 boost::array 作为对象变量

标签 c++ arrays class boost templates

我想使用 boost::array 作为类成员,但我不知道编译时的大小。 我想过这样的事情,但它不起作用:

int main() {
    boost::array<int, 4> array = {{1,2,3,4}};
    MyClass obj(array);
}

class MyClass {
    private:
        boost::array<int, std::size_t> array;
    public:
        template<std::size_t N> MyClass(boost::array<int, N> array)
        : array(array) {};
};

编译器 gcc 说:

error: type/value mismatch at argument 2 in template parameter list for
  ‘template<class _Tp, long unsigned int _Nm> struct boost::array’
error:   expected a constant of type ‘long unsigned int’, got ‘size_t’

这显然意味着不能使用可变大小的数组作为类成员。如果是这样,这将否定 boost::array 相对于 vector 或标准数组的所有优势。

你能告诉我我做错了什么吗?

最佳答案

Boost 的数组是基于第二个模板参数的固定大小的,boost::array<int,4>是与 boost::array<int,2> 不同的类型 .您不能拥有其成员具有不同类型的同一类(在您的示例中为 MyClass)的实例。

然而,std::vectors 可以有不同的大小而不是不同的类型:

struct MyClass {
  template<std::size_t N>
  explicit
  MyClass(boost::array<int, N> const& array)
  : data(array.begin(), array.end())
  {}

private:
  std::vector<int> data;
};

int main() {
  boost::array<int, 4> a = {{1,2,3,4}};
  MyClass obj(a);

  boost::array<int, 2> a2 = {{42,3}};
  MyClass obj2(a2);

  // notice obj.data.size() != obj2.data.size()

  return 0;
}

也就是说,boost::array 仍然有用(它甚至在本示例代码中也很有用),只是不是以您想要使用它的确切方式。

关于c++ - 如何使用大小未知的 boost::array 作为对象变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031940/

相关文章:

c++ - 'BOM' 字符在文件开头或文件结尾的位置是什么?

javascript - 使用 Javascript 更改类时出现问题

perl - 如何在perl中对对象进行散列

python - 如何覆盖类的 __dir__ 方法?

c++ - 为什么 `abs()` 的实现方式不同?

c++ - gcc 3.4 内部编译器错误与 std::map.find

c++ - 如何使用匿名命名空间在.cpp 文件中设置静态成员变量?

c - 将数组及其长度变量包装在 C 的结构中是最佳实践吗?

java - 我无法访问 TreeMap 中的 int[]

javascript - 将 HTML-Select 附加到输入并在用户单击“保存”按钮后存储它们的值