Я хочу, чтобы проверить размер следующей структуры на конкретизации с 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 простой, без баловаться с хелперов структур
Любое другое решение, которое я не хватает?
Я решил восстановить этот вопрос и оставить его открытым для возможных решений в будущем.
Конечно 'sizeof' не допускаются incomlete типов, но при создании экземпляра структуры того типа' Т * не может быть неполным, иначе он просто не будет компилироваться, с или без 'sizeof' – SomeWittyUsername
Вы не можете создать объединение, не зная размеров этих типов, так что вам нужно, чтобы тип был полным. Итак, первое решение должно быть прекрасным. – OMGtechy
Существует еще деструктор, но (как и для конструктора) вы можете разбить некоторые свойства (совокупность, тривиально разрушаемая). И вам нужно включить конструктор/назначение move/copy. – Jarod42