- 1
- 2
- 3
- 4
- 5
typedef ::boost::array<T, item_amount+1> not_raw_array;
union data
{
not_raw_array m_raw_array;//Most members of boost::array not suitable for call with raw array. Be careful!
};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+11
typedef ::boost::array<T, item_amount+1> not_raw_array;
union data
{
not_raw_array m_raw_array;//Most members of boost::array not suitable for call with raw array. Be careful!
};
Это часть контейнера. Автор не использовал not_raw_array напрямую, а завернул его в union, чтобы иметь возможность произвольно создавать и убивать объекты в m_raw_array массиве. Иначе без union в not_raw_array объекты создадутся сами, если имеют нетривиальный конструктор. Может в С++11 оно у автора и работало, но у меня вчера бомбануло, когда я дописал конструктор в структуру (шаблонное T), что хранил в этом контейнере.
ставлю плюс за задумку, тру какир
хак окей
char[...] это, как ни крути, массив чаров, и чтобы получить i-тый T & из него, нужно мало того, что развлекаться с sizeof(T), но и постоянно приводить (char *) к (T *), а (char const *) к (T const *)
сделал бы я так же, если бы приспичило (тьфу тьфу)? нет, слишком неочевидно - не проссышь без объяснений, что это вообще, в отличие от классического char[...]
> постоянно приводить
Сколько сарказма в этом предложении... Осторожнее надо быть, читатели ведь и правда могут поверить, что там что-то сложнее пары приватных методов с одним реинтерпрет кастом внутри, да сайзофа при объявлении массива...
То есть недоконструированные объекты в случае исключения он не откатит.
В случае исключения я даже узнать не смогу что успело создаться, а что нет
А ещё в конструкторе и assignment operator
У меня конечно есть исходники и сейчас поправлю, но противно.
Что посоветуете взамен std::uninitialized_copy, окромя самописного велосипеда? Может что из буста?