繁体   English   中英

如何从可变参数构造函数参数构造任何对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM