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