std::array<T, ?> 类型的成员变量
Posted
技术标签:
【中文标题】std::array<T, ?> 类型的成员变量【英文标题】:Member variable of type std::array<T, ?> 【发布时间】:2012-12-05 19:19:17 【问题描述】:如何为 std::array<T, ?>
类型的模板类 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::vector
。 std::array
的大小必须是编译时常量。如果要在构造函数中传递,则需要使用std::vector
。
【讨论】:
或std::unique_ptr<T[]> array
,如果不需要调整大小和其他vector
功能。
嗯,我不确定这是否有任何好处。语法肯定更复杂,我怀疑它是否明显更快或更节省内存。
我不认为它会更快,但它的内存开销确实比vector
略少。正如我所说,如果不需要调整大小,可能值得考虑,否则使用vector
。
@Praetorian 什么开销少一点?如果有的话,unique_ptr<T[]>
有底层,因为它不知道它的大小。
@R.MartinhoFernandes 我不也是这么说的吗?与vector
相比,unique_ptr<T[]>
的内存开销更少?【参考方案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<T[]>
或std::vector
。
【讨论】:
以上是关于std::array<T, ?> 类型的成员变量的主要内容,如果未能解决你的问题,请参考以下文章