2013-09-30 4 views
0

Для тестирования подходит ли тот или иной тип в aligned_storage, я создал следующую тестовую структуру:Испытание на размер aligned_storage

template< typename T, std::size_t Bytes > 
struct fits_in_storage : public std::integral_constant<bool, sizeof(std::aligned_storage<Bytes>::type) >= sizeof(std::aligned_storage<sizeof(T)>::type)> 
{}; 

Теперь я вроде интересно ли такой тест/будет присутствовать в STDLIB , Не хотел бы изобретать колесо.

Я использую его для проверки того, имеет ли заголовок, заданный aligned_storage (размером Bytes), внутренний тип данных, который доступен только в реальном блоке компиляции.

+0

Я не уверен, что вы хотите проверить здесь. Первый параметр шаблона 'aligned_storage' указывает размер, тогда как второй параметр определяет выравнивание. Без второго параметра вы проверяете только строжайшее выравнивание для объекта не более указанного размера? – dyp

+0

@DyP В настоящее время да. Возможно, я добавлю третий параметр шаблона по умолчанию в 'fits_in_storage'. – abergmeier

+0

N.B. Из-за * не более указанного размера * существует гарантия того, что самое строчное выравнивание получает только * более строгий для больших объектов. То есть если 'Bytes> = sizeof (T)', объект типа 'T' будет соответствовать и быть правильно выровнен в' aligned_storage :: type'. – dyp

ответ

1

Нет гарантий на размере aligned_storage<Len, Align>::type кроме не менееLen байт. Было бы возможно (но маловероятно), что ::type для меньшего Len больше, чем для большего Len.

[meta.trans.other] состояния, для

aligned_storage<std::size_t Len, std::size_t Align =по умолчанию-выравнивания>

Значение по умолчанию выравнивания должны быть самым строгим требованием выравнивания для любого C++ тип объекта , размер которого не превышает Len (3.9). Тип typedef типа должен быть POD-типом, подходящим для использования как неинициализированное хранилище для любого объекта , размер которого не превышает Len, а выравнивание - это делитель Align.

Таким образом, любой объект с размером, меньшим или равным Len может быть сохранен в aligned_storage<Len>::type. Следовательно, чек может быть упрощена:

template< typename T, std::size_t Bytes > 
struct fits_in_storage 
    : public std::integral_constant<bool, (Bytes >= sizeof(T))> 
{}; 

Что, конечно, может быть упрощенно Bytes >= sizeof(T).

+0

Если требуется metafunction (а не просто условие 'Bytes> = sizeof (T)', как вы предлагаете), я бы упростил его еще больше и сделал его шаблоном псевдонимов для 'typename std :: conditional <(Bytes > = sizeof (T)), std :: true_type, std :: false_type> :: type' –

+0

@JonathanWakely Я думаю, что я также считал это, но версия 'integ_constant' немного короче;) Шаблон псевдонима вместо' struct' удаляет 3 символа , хоть. – dyp

+1

Главное преимущество IMHO заключается в том, что шаблоны псевдонимов более легкие, чем определение и создание новых шаблонов классов, поэтому их быстрее компилировать. –

Смежные вопросы