Я пишу упаковщик массива в C ++ (например, std::array
). Мотивация состояла в том, чтобы сделать массив-оболочку производной интерфейса. Это позволяет передавать массивы в функции, не делая их шаблонными (через интерфейс). Способ его реализации выглядит немного подозрительно, поэтому я хочу спросить, является ли приведенный ниже код законным в C ++ или нет? В примере показан способ использования членов объединения, я попытался сделать наименьший пример, чтобы интерфейса и других вещей здесь не было. Основная проблема заключается в использовании членов профсоюза таким образом. Причина, по которой я это делаю, состоит в том, чтобы сделать возможным создание массива типов без c-tor по умолчанию (к сожалению, в этом примере это тоже не показано).
template<typename T, size_t N>
class Array
{
public:
Array() :
m_data( m_originalObjects ),
m_len(N),
m_place()
{
for( decltype(N) i = 0; i < N; i++ )
{
new( &m_data[i] )T();
}
}
//c-tor to objects without default c-tor
template<typename ... TCon>
Array( TCon && ... values ) :
m_data( m_originalObjects ),
m_len(N),
m_originalObjects{ static_cast<T>(values)... }
{
}
private:
T * m_data = nullptr;
size_t m_len = 0;
union
{
char m_place[sizeof(T) * N];
T m_originalObjects[N];
};
};