У меня есть следующий вариант использования, структура с некоторыми логическими и int переменными
struct a {
int field1;
bool field2;
bool field3;
};
Я реорганизую этот код и пишу конструктор для структуры, проблема заключается в инициализации полей по умолчанию.
Я не критикую здесь какие-либо языковые конструкции, но в идеале я бы хотел, чтобы null был частью самого языка.
я имею в виду, что я должен иметь возможность определить структуру как
a : field1(null.int), field2(null.bool), field3(null.bool) {}
C++ не допускает этого, поскольку null.int или null.bool не определены. Единственный способ сделать на С ++ -
a: field1(-1), field2(false), field3(false) {}





Ты можешь сделать
struct a {
a():field1(), field2(), field3() { }
int field1;
bool field2;
bool field3;
};
И все поля будут соответственно нулевыми и ложными. Если вы хотите сказать, что поля имеют неопределенное значение, боюсь, вам придется использовать другие методы. Один из них - использовать boost::optional:
struct a {
a():field1(int()), field2(bool()) { }
optional<int> field1;
optional<bool> field2;
optional<bool> field3;
};
Оставляет поле 3 неопределенным. Доступ к значениям с *field_name. Проверьте отсутствие значения с помощью field == boost::none или if (field) { ... }.
Логическое значение имеет два состояния. Вот что делает его логическим. Итак, в любом строго типизированном языке логическое значение может быть либо истинным, либо ложным.
Целое число в c / C++ (и java) - это прямое двоичное представление числа. Вы можете присвоить одно значение этого числа, означающее, что «это число не имеет значения», но это не имеет смысла во всех ситуациях - и если бы язык учитывал это, каждой математической операции должна была бы предшествовать проверка. - это действительно замедлит работу.
Итог: если вам нужна слабая система шрифтов, используйте другой язык.
Кажется, вы хотите сказать, что поля находятся в неопределенном состоянии.
Это противоречит принципам языка строгих типов (например, C++), поэтому вам не повезло. Если вы хотите проверить, не было ли что-то определено, вам нужно явно отслеживать это самостоятельно. Вы могли бы потенциально использовать указатели для решения своей проблемы, но я лично не думаю, что это было бы хорошей идеей.
Может быть, если вы попытаетесь объяснить реальную проблему, которую пытаетесь решить, мы сможем дать лучший совет.
Если вы ищете тип со значениями {true, false, null}, этот тип не является логическим. Однако boost::optional<bool> - это такой тип. Точно так же boost::optional<int> может содержать любое int или вообще не содержать int.
Это способ C++ не платить за то, что вы не используете, и инициализация по умолчанию, а возможность иметь неинициализированный bool - это то, что многим людям не понадобится.
Если вам действительно нужно такое поведение, вы можете создать версию того типа, с которым вы работаете, с нулевым значением. Что-то вроде:
class NullBool {
bool m_null;
bool m_value;
public:
NullBool() : m_null(true) {}
NullBool(bool value) : m_null(false), m_value(value) {}
void isNull() const {
return m_null;
}
void value() const {
return m_value;
}
...
// lots of operations
...
};
Вероятно, это должно быть построено как шаблон, чтобы он работал с большим количеством типов из коробки. И поскольку это ваш собственный тип, вы можете легко сделать конструктор по умолчанию, чтобы он по умолчанию был нулевым.
Определенно кажется так, я не знал об этом, пока litb не отредактировал свой пост, чтобы упомянуть об этом :)
этот шаблон будет ... boost :: optional <T>?