簡體   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