以下は、各要素が同じ引数で構築されているという仮定の下での単純ではあるが不完全な解決策です。配置を使用して要素をインプレースで構築します (new
この SO の質問も参照してください)。
#include <cstdlib>
#include <utility>
#include <new>
// sample structure, non-copyable, non-moveable, non-default-constructible
struct Foo
{
Foo() = delete;
Foo(const Foo&) = delete;
Foo& operator = (const Foo&) = delete;
Foo(Foo&&) = delete;
Foo& operator = (Foo&&) = delete;
Foo(int a, char b, double c) : m_a(a), m_b(b), m_c(c) { }
int m_a;
char m_b;
double m_c;
};
template <typename T>
struct MyArray
{
// Array ctor constructs all elements in-place using the
// provided parameters
template <typename... Args>
MyArray(std::size_t sz, Args&&... args)
: m_sz(sz),
m_data(static_cast<T*>(malloc(sz * sizeof(T))))
{
for (std::size_t i=0; i<m_sz; ++i)
{
new (&m_data[i]) T(std::forward<Args>(args)...);
}
}
~MyArray()
{
for (std::size_t i=0; i<m_sz; ++i)
{
m_data[i].~T();
}
free(m_data);
}
std::size_t m_sz;
T *m_data;
};
int main()
{
Foo foo(1, '2', 3.0);
std::size_t s = 5;
MyArray<Foo> foo_arr(s, 1, '2', 3.0);
}
いくつか不足していることに注意してください。
MyArray
この基本的な実装では、のコンストラクター内で例外がスローされると、メモリ リークが発生します。
- 利便性を高め、標準コンテナが提供するのと同じ動作を得るために、おそらくイテレータの実装や
begin()
/演算子などが必要になるでしょう。end()
- 説明のために、適切なカプセル化も気にしませんでした。おそらくプライベートメンバーを作成する必要が
m_sz
あります。m_data