Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
sizeof возвращает размер с учетом выравнивания. Так что не вижу с этим проблемы. Или какой то еще подвох здесь есть?unsigned char mem[usize] лучше использовать его.Фактически, вы изобрели вариант, вроде boost::variant.
class BaseCreator
{
// boost::none_t - чтобы иметь пустое состояние и конструктор по умолчанию без накладных расходов
typedef boost::variant<boost::none_t, A, B> obj_t;
obj_t obj;
public:
BaseCreator() = default; // noexcept
BaseCreator(bool x)
: obj(x ? obj_t(A()) : obj_t(B()))
{}
// Можно не запрещать копирование :)
BaseCreator(const BaseCreator &) = default;
// Перемещение
BaseCreator(BaseCreator &&) = default;
Base* operator->()
{
// polymorphic_get был добавлен в Boost 1.56. Рекомендую к употребелению! Классная штука.
//
// Если это единственное место где используется Base, то
// деструктор можно не делать виртуальным.
//
// Кстати, Ваш пример будет некорректно работать в случае сложного множественного наследования:
// так reinterpret_cast<T*>(mem); не справится с struct A: virtual Base1, virtual Base {...}
return &boost::polymorphic_get<Base>(obj);
}
};
Может вернуть только один объект за раз
TypeUnion(TypeUnion &&) = default я поторопился. Еще одни грабли. assert ( deleter ); // TypeUnion::assign was not calledТ.е. каким то образом deleter == nullptr. Попробую найти GCC 4.9.0 и отдебажить.template <std::size_t Len, typename ...Types>
struct aligned_union {
static constexpr size_t max(size_t r0) {return r0;}
template <typename ...R> static constexpr size_t max(size_t r0, R... r) {return ( r0 > max(r...) ? r0 : max(r...) );}
static constexpr std::size_t alignment_value = max(alignof(Types)...);
struct type { alignas(alignment_value) unsigned char _[max(Len, sizeof(Types)...)]; };
};
unsigned char mem[usize];
заменено на typedef typename aligned_union<usize, Types...>::type aligned_type;
aligned_type _storage;
aligned_type *mem = &_storage;
alignas(max(alignof(Types)...)) unsigned char mem[usize];
unsigned char mem[usize]; на alignas(max(alignof(Types)...)) unsigned char mem[usize];, то делу это не поможет, все равно будет падать. Так что проблема не в alignment-е. Более того, если написать unsigned char mem_s[usize];
void* mem = mem_s;
Фабричный метод без размещения в динамической памяти