Ich versuche, eine sehr vereinfachte Version eines Containers zu implementieren, um zu demonstrieren, wie ein Container, der eine std :: initializer_list akzeptiert, als Parameter unter die Haube aussehen könnte. Ist diese Implementierung genau? < /P>
template
class Container
{
public:
Container(std::initializer_list lst)
: m_size(lst.size()), m_data(nullptr), m_constructed(0)
{
// Allocate raw memory (note: operator new returns uninitialized storage)
m_data = static_cast(::operator new(m_size * sizeof(T)));
try
{
// Copy Construct objects using placement new
for (auto& item : lst)
{
new(&m_data[m_constructed]) T(item);
++m_constructed;
}
}
catch(...)
{
// Only destroy the elements that were constructed
cleanup();
throw;
}
}
~Container()
{
cleanup();
}
private:
void cleanup()
{
// Only call the destructor for the constructed elements
for (size_t i = m_constructed; i > 0; --i)
{
m_data.~T();
}
::operator delete(m_data);
m_data = nullptr;
m_constructed = 0;
}
size_t m_size;
size_t m_constructed; // Tracks how many elements were actually constructed.
T* m_data;
};
< /code>
Hier ist der Link, der eine Hauptfunktion und eine Klasse enthält, um meine vereinfachte Containerimplementierung zu testen. https://godbolt.org/z/8thk8g9p1
C ++, der einen vereinfachten Container demonstriert, der std :: initializer_list als Parameter akzeptiert (Verhalten un ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post