Я хочу определить во время компиляции (статическое утверждение), удовлетворяет ли класс обоим следующим условиям:
- Имеет неявный конструктор по умолчанию (т. Е. Пользовательский конструктор по умолчанию отсутствует).
- Имеет, по крайней мере, один элемент данных, который является модулем (т. Е. Элементом, инициализация которого по умолчанию предполагает наличие любых случайных байтов в его адресе памяти).
[Я надеюсь, что я использовал термин pod здесь правильно]
Идея состоит в том, чтобы избегать работы с объектами с неинициализированными членами. Я знаю, что есть разные способы сделать это во время кодирования, но я также хочу механизм, чтобы обнаружить это во время компиляции.
Я пытался использовать разные функции std / boost, такие как is_trivially_constructible, is_pod, но ни одна из них не дает точных терминов, которые мне нужны.
Например, допустим, у меня есть следующие классы:
struct A
{
int a;
}
struct B
{
int* b;
}
struct C
{
bool c;
std::string c_str_;
}
struct D
{
D();
float d;
}
struct E
{
std::string e;
}
Предполагая, что нужная мне функция называется has_primitive_and_implicit_ctor, я бы хотел, чтобы вывод для каждого вызова был таким, как в комментариях:
has_primitive_and_implicit_ctor<A>(); //true - A has at least one pod type member (int)
has_primitive_and_implicit_ctor<B>(); //true - A has at least one pod type member (pointer)
has_primitive_and_implicit_ctor<C>(); //true - A has at least one pod type member (bool), even though there is one non-pod member
has_primitive_and_implicit_ctor<D>(); //false - has a pod member(float), but a user defined ctor
has_primitive_and_implicit_ctor<E>(); //false - doesn't have a default ctor but has no pod members