Open pavelkryukov opened 2 years ago
Похоже, есть в Reflection TS:
template <SpecialMemberFunction T> struct is_implicitly_declared;
template <SpecialMemberFunction T> struct is_defaulted;
All specializations of these templates shall meet theUnaryTypeTrait
requirements (20.10.1). If their template parameter reflects a special member function that is implicitly declared (foris_implicitly_declared
) or that is defaulted in its first declaration (foris_defaulted
), the base characteristic of the respective template specialization istrue_type
, otherwise it isfalse_type
.
Предлагается ввести следующие type traits:
Эти структуры предоставляют
::value == true
тогда и только тогда, когда соответствующая функция определяется компилятором:= default;
is_default_XXX
— более строгое условие, чемis_XXX
, но менее строгое, чемis_trivially_XXX
.Примеры
Мотивация
Наличие свойства
is_default_...
говорит, что объект этого типа может быть безопасно создан/скопирован/перемещён/уничтожен применением операции к каждому из полей, при этом нет ограничений на каждое поле. Такие type traits обобщают работу с агрегатами, в частности, их преобразование в кортежи и обратно через Boost.PFR, и преобразование в менее стандартные структуры данных (например, SoA).На текущий момент С++ имеет type trait
is_aggregate
, имеющий похожий функционал. Однако, соответствующим ему типам позволено иметь явно определённые операторы присваивания и деструкторы:Замечания
Декларация и определение
Отметим, что для следующего кода установить истинность type trait невозможно:
Короткая форма
В духе C++17 вводятся короткие формы: