![](/img/trans.png)
[英]How to construct an object from a tuple when it does not have any constructor
[英]How to construct any object from variadic constructor parameters?
我正在尝试制作自己的容器,并且正在为Vector类编写Emplace方法。
首先,这是我的前进功能:
template<typename T>
T&& Forward(typename remove_reference<T>::Type& arg)
{
return static_cast<T&&>(arg);
}
template<typename T>
T&& Forward(typename remove_reference<T>::Type&& arg)
{
static_assert(!Internal::is_lvalue_reference<T>::Result);
return static_cast<T&&>(arg);
}
它们与std
基本相同。
现在这是我的Emplace
方法:
template<typename T>
template<class... ARGS>
void MyVector<T>::Emplace(ARGS&&... args)
{
Add(Forward<ARGS>(args)...);
}
这给我一个错误“函数不带2个参数”,因为Add并非设计用于可变参数。 因此,我只是就地执行它:
template<typename T>
template<class... ARGS>
void MyVector<T>::Emplace(ARGS&&... args)
{
if(size >= capacity)
{
AdaptCapacity();
}
data[size++] = value;
}
我应该在_data[_size++] = value;
? 如何使用可变参数构造任何“ T”? 如果我将Forward调用传递给T的构造函数,由于语法“ ...”,它将给我与传递给Add相同的错误。 我还可以做些什么?
我尝试在std :: vector内部查找,发现的只是一些函数_Alty_traits::construct
似乎没有任何定义(编译器内部函数?)
这是否意味着我不可能编写自定义Emplace方法?
通常,如果date
本身是vector<T>
或类似的vector<T>
,则可以执行以下操作:
date[size++] = T(std::forward<ARGS>(args)...);
但是,如果您正在编写自己的向量,则data
基本上会保留一些原始内存。 您需要的是直接在原始内存中构造一个对象。 为此,您需要放置新的位置:
new (date + size++) T(std::forward<ARGS>(args)...);
请注意,此放置新问题与使用等角函数正交。 您还需要在编写push_back
时放置新的位置。
编辑:因为您没有告诉我们date
的类型或内容,并且根据您在此处的评论,所以我假设您执行了以下操作:
data = new T[capacity];
如果这是您所做的,那么您必须使用我提供的第一个表格; 使用第二种形式是不确定的,因为您是在另一个对象之上构造一个对象(然后您将永远无法调用其析构函数)。
但是,这不是编写矢量(或任何其他通用容器)的正确方法。 当向量获取更多的内存时,它应该仅获取更多的内存,而不构造任何东西( new T[capacity]
默认构造动态数组中的所有条目),在这种情况下,您必须使用第二种形式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.