Лучший способ инкапсулировать «необязательные» поля в структуре в целом в C ++? - PullRequest
4 голосов
/ 21 марта 2011

У меня много бетонных конструкций, и я хочу обозначить поля как необязательные (настоящие или нет).Просто интересно, какие у людей есть идеи для достижения этой цели.Вот пример структуры (поля могут быть и другими структурами, даже векторами структур):

 struct LogonMessage_t
       {
          Header_t header; // this points to another struct containing all primitives
          std::string username;
          std::string password;
          std::vector<LogonOption_t> LogonOptions;
          int subaccountid;
          std::string Text;
       }

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

Мои идеи на данный момент таковы:

  1. Битовая карта полей, указывающая, установлено поле или нет
  2. Использовать значения часового типа ("\ 0" для std ::строка, -1 для int, -1.0f для float
  3. Какой-то шаблон-контейнер / прокси, инкапсулирующий каждое поле, чтобы указать, установлено оно или нет, есть идеи? Я думаю, что это может быть лучшим подходом.

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

Ответы [ 4 ]

6 голосов
/ 21 марта 2011

Звучит так, как вы хотите повышение . необязательно .

2 голосов
/ 21 марта 2011

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

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

0 голосов
/ 21 марта 2011

Я бы использовал один флаг. Я могу предложить вам два метода: один хранит значение в куче, а другой в стеке.

В первом случае вы используете std :: pair, а первое поле - это флаг существования. Второй подход - через boost :: shard_ptr, если указатель указывает на 0, поле не существует.

В обоих случаях я советую не обращаться непосредственно к элементу в Value, а использовать вместо этого пару функций. const Value & value () const {возврат} Value & value () {return}

1007 * Франческо *

0 голосов
/ 21 марта 2011

И строка, и вектор имеют пустое состояние по умолчанию, которое можно проверить с помощью if (username.empty()) и т. Д.

Для subaccountid Я бы предположил, что 0 будет аналогичным пустым значением.В противном случае -1 может быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...