首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用大小未知的boost::array作为对象变量

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

Stack Overflow用户
提问于 2010-01-09 09:27:11
回答 3查看 30.4K关注 0票数 17

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

代码语言:javascript
复制
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,说:

代码语言:javascript
复制
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相对于向量或标准数组的所有优势。

你能告诉我我哪里做错了吗?

EN

回答 3

Stack Overflow用户

发布于 2010-01-09 09:35:58

不,boost::array (它在TR1中作为std::tr1::array)是一个静态大小的缓冲区。该类的要点是避免动态内存分配--您可以将一个boost::array完全放在堆栈上。

您可以让您的示例类接受一个模板int并将其传递给boost::array成员,

代码语言:javascript
复制
template<int Size>
class MyClass
{
private:
    boost::array<int, Size> m_array;
public:
    // ....
};

但这只是装饰品,它仍然是一个静态分配。

票数 3
EN

Stack Overflow用户

发布于 2010-01-09 09:33:51

你对这个错误的看法是错误的:

代码语言:javascript
复制
    template<unsigned long N> MyClass(boost::array<int, N> array) : array(array) {};

应该行得通。顺便说一句,这仍然会在编译时生成数组,所以这不是一个好的解决方案。和其他错误将会发生。

这里您需要的是一个向量,它有一个保留的大小和一些将容量保持在固定大小的断言。

票数 1
EN

Stack Overflow用户

发布于 2013-09-02 21:38:17

如果不需要动态调整大小,则不需要std::vector

只需让函数接受*int

代码语言:javascript
复制
MyFunction (int* array,int size); // function prototype

并将boost::array的.data()指针传递给数据...

代码语言:javascript
复制
boost::array<int,4> testArray;
boost::array<int,5> testArray2;

// Calling the function:
MyFunction(testArray.data(),4);
MyFunction(testArray2.data(),5);

关键是.data()人!如果您希望boost数组替换常规数组,这可能是一种方法(不需要使用模板和所有这些)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2031940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档