std::array<T, ?> 类型的成员变量

Posted

技术标签:

【中文标题】std::array<T, ?> 类型的成员变量【英文标题】:Member variable of type std::array<T, ?> 【发布时间】:2012-12-05 19:19:17 【问题描述】:

如何为 std::array&lt;T, ?&gt; 类型的模板类 AClass 声明和设置成员变量(未定义大小)?实际的std::array是在构造函数中创建的,其中数组的大小是构造函数的参数。

在伪 C++ 代码中:

template <typename T> class AClass 

protected:
    std::array<T, ?>* array;

public:

    AClass(int n) 
        this->array = new std::array<T, n>;
    


正确的代码是什么样的?

【问题讨论】:

new 是干什么用的? 这完全不是std::array 的用途,你不能像这样将参数传递给模板。 @R.MartinhoFernandes 告诉我为什么这里是错误的(忽略这是不可能的,因为std::array 的大小必须是编译时常量)。 @cls: #1 它不能编译,因为成员不是指针; #2 它会泄漏资源,因为它放弃了编译器保证的析构函数调用。 AClass(int n) : array() 可以正常工作(忽略大小必须在编译时可用的事实),或者 AClass(int n) : array(n) 用于向量成员。一般来说,您可以使用T() 创建T 类型的对象;不涉及new,这不是Java。 【参考方案1】:

不要为此使用std::array,请使用std::vectorstd::array 的大小必须是编译时常量。如果要在构造函数中传递,则需要使用std::vector

【讨论】:

std::unique_ptr&lt;T[]&gt; array,如果不需要调整大小和其他vector 功能。 嗯,我不确定这是否有任何好处。语法肯定更复杂,我怀疑它是否明显更快或更节省内存。 我不认为它会更快,但它的内存开销确实比vector 略少。正如我所说,如果不需要调整大小,可能值得考虑,否则使用vector @Praetorian 什么开销少一点?如果有的话,unique_ptr&lt;T[]&gt; 有底层,因为它不知道它的大小。 @R.MartinhoFernandes 我不也是这么说的吗?与vector 相比,unique_ptr&lt;T[]&gt; 的内存开销更少?【参考方案2】:

实际的std::array要在构造函数中创建,其中数组的大小是构造函数的参数。

std::array 的大小必须在编译时知道,在你的情况下它不是。

您必须为此使用std::vector

【讨论】:

【参考方案3】:

与在运行时真正定义大小的std::vector 分开,您还可以选择在编译时指定大小(例如,根据您的问题设置为最大可能值)并将模板参数“传播”给客户端你的班级,即

template <typename T, std::size_t n> 
class AClass 
   protected:
       std::array<T, n> array;
   public:
       AClass() 
           // nothing to do
       

然后你像这样使用它:

AClass<int, 5> myAClass;

【讨论】:

是的,但是对于数组的大小作为构造函数参数有一个明确的要求。在这里,它不是,也不可能。 取决于 OP 的真正要求,有时 OP 会引入不必要的要求,实际上在编译时大小是已知的。【参考方案4】:

您不能拥有未定义大小的std::array。 请改用std::unique_ptr&lt;T[]&gt;std::vector

【讨论】:

以上是关于std::array<T, ?> 类型的成员变量的主要内容,如果未能解决你的问题,请参考以下文章

在现代 C++ 中将 std::array<std::array<T,N>> 转换为 std::vector<T>

std :: array<T, 0> 的目的是啥?

附加到 std::array

具有 std::array 大小类型的派生模板类

为双向量保留空间

07--STL序列容器(Array)