Как я могу определить, есть ли у класса неявный конструктор И примитивные члены в c ++? - PullRequest
0 голосов
/ 26 июня 2019

Я хочу определить во время компиляции (статическое утверждение), удовлетворяет ли класс обоим следующим условиям:

  • Имеет неявный конструктор по умолчанию (т. Е. Пользовательский конструктор по умолчанию отсутствует).
  • Имеет, по крайней мере, один элемент данных, который является модулем (т. Е. Элементом, инициализация которого по умолчанию предполагает наличие любых случайных байтов в его адресе памяти). [Я надеюсь, что я использовал термин 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

1 Ответ

2 голосов
/ 26 июня 2019

Во-первых, мне кажется, что сломанный дизайн ожидает от пользователя класса заботы об инициализации его члена.Вы должны убедиться, что в самом классе все его члены инициализированы, а не где-то еще, где он используется.

То, что вы ищете, не существует, и если бы это было так, это даже не помогло бы вам.Наличие явного конструктора не гарантирует инициализации элемента данных.С другой стороны, в C ++ 11 можно даже инициализировать элементы данных без явной записи конструктора (используя синтаксис фигурных скобок в объявлении класса).Также вам кажется, что вас волнуют неинициализированные члены POD, но как насчет неинициализированных не POD членов?

При этом компилятор может генерировать предупреждения о неинициализированных значениях, но часто вам нужно включить это предупреждение (например, -Wuninitialized option)для gcc).Большинство компиляторов позволяют принудительно рассматривать предупреждения как ошибки.В сочетании это может дать желаемый эффект даже без специального написания кода для его проверки, и это также будет работать для любых неинициализированных значений, не только для классов.Может быть, это то решение, которое вы ищете.

...