2016-03-29 1 views
5

Я хочу, чтобы проверить размер следующей структуры на конкретизации с static_assert сдерживать, что неназванный struct плотно упакован, таким образом, размер A эквивалентен sizeof(T) * 3.Статических утверждать размер типа шаблона на конкретизации

template <typename T> 
struct A 
{ 
    union 
    { 
     struct { T a, b, c; }; 
     T arr[3]; 
    }; 
}; 

Это может быть сделано с

static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong"); 

Однако

  • поскольку A<T> еще неполный тип внутри определения класса, поставив выше static_assert в определении класса является не вариант

  • static_assert с sizeof не оценивает внутри не-инстанцирован функций во всех составителей (как Clang), поэтому положить его в фиктивную функцию-член не вариант

  • static_assert положить в конструктор или деструктор будет решением , но в приведенном выше примере не определенный пользователем конструктор не существует (думаю о агрегатов), кроме того, представить себе случай нескольких конструкторах, где я хотел бы избежать выполнения утверждение во всех из них

  • наследуя A от другого структуры , и выполнение static_assert по тому, что в de FINITION из A был бы решением, но я хочу, чтобы держать STRUCT простой, без баловаться с хелперов структур

Любое другое решение, которое я не хватает?

Я решил восстановить этот вопрос и оставить его открытым для возможных решений в будущем.

+0

Конечно 'sizeof' не допускаются incomlete типов, но при создании экземпляра структуры того типа' Т * не может быть неполным, иначе он просто не будет компилироваться, с или без 'sizeof' – SomeWittyUsername

+0

Вы не можете создать объединение, не зная размеров этих типов, так что вам нужно, чтобы тип был полным. Итак, первое решение должно быть прекрасным. – OMGtechy

+1

Существует еще деструктор, но (как и для конструктора) вы можете разбить некоторые свойства (совокупность, тривиально разрушаемая). И вам нужно включить конструктор/назначение move/copy. – Jarod42

ответ

0

Одна специальная функция члена (почти) гарантированно инстанцировано является деструктором:

~A() noexcept { static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong"); } 
+0

Да, но поскольку @ Jarod42 также указал в своем комментарии, это приведет к разрушению совокупного правила и тривиальной деградации. – plasmacel

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