AS_IF([test "x$with_docs_only" == xyes],
[AS_IF([DX_TEST_FEATURE(doc) && DX_TEST_FEATURE(html) &&
DX_TEST_FEATURE(man) && DX_TEST_FEATURE(pdf)],
[AS_MESSAGE([=====SUCCESS=====])],
[AC_MSG_ERROR([=====FAILURE=====])])])
Это можно сделать с помощью макроса DX_TEST_FETURE
(см. Пример выше) из ax_prog_doxygen
, который проверяет, доступны ли некоторые инструменты. В этом примере он проверяет инструменты doxygen, html, man и pdf.
Реальность такова, что вы не можете этого сделать. Значение bool имеет значение true или false, и если вы не инициализировали его, то оно случайным образом равно true или false, возможно, различается при каждом запуске программы или распределении этого класса.
Если вам нужен тип с дополнительными опциями определите перечисление.
typedef enum MyBool {
TRUE,
FALSE,
FILENOTFOUND
} MyBool;
Tristate bool - путь к темной стороне. Tristate bool приводит к гневу. Гнев ведет к ненависти. Ненависть ведет к страданиям.
Предпочитайте не использовать тристатный бул.
Вместо этого используйте один дополнительный логический параметр для определения того, является ли первый логический параметр «инициализированным» (или, лучше, «известным») или нет.
class Prisoner : public Person
{
...
bool is_veredict_known;
bool is_guilty;
}
Если veredict еще не известен, вы не можете сказать, действительно ли Prisoner виновен, но ваш код может различать различные ситуации. Конечно, Конституция гарантирует, что значение по умолчанию is_guilty должно быть ложным, но все же ... :)
Кстати, инвариант класса должен включать:
assert(is_veredict_known || !is_guilty);
Звучит так, как будто вы хотите boost :: tribool или, может быть, boost :: необязательный
Если это то, что вам нужно, создайте значение, которое представляет концепцию значения, которое, возможно, не было инициализировано.
template <typename T>
struct Maybe {
Maybe() : m_hasValue(false) {}
bool HasValue() const { return m_hasValue; }
T& Value() { ThrowIfFalse(m_hasValue); return m_value; }
const T& Value() const { ThrowIfFalse(m_hasValue); return m_value; }
void SetValue( _In_ const T& value) { m_value = value; m_hasValue = true; }
private:
bool m_hasValue;
T m_value;
};
Теперь вы можете представить все 3 состояния, которые вам нужны.
class SomeType {
...
Maybe<bool> m_myBool;
}
В C ++ bool
- это только один бит информации, либо 0, либо 1. Поскольку вы хотите представить три возможных состояния, вам нужен еще один бит информации , Существует два основных метода:
bool
, чтобы указать, является ли значение «по умолчанию» или нет, или Я бы, наверное, выбрал вариант 1.
У вас может быть отдельный закрытый член, который указывает, было ли значение bool действительно инициализировано или нет.
Вы действительно не можете. Не могли бы вы предоставить второй конструктор, например:
class MyClass {
public:
MyClass(bool bFlag); // <-- not default
MyClass(void); // <-- default
};
Вместо логического значения используйте перечисление. Например, чтобы контролировать уровень магии:
enum {
MY_ENUM_NO_MAGIC,
MY_ENUM_SOME_MAGIC,
MY_ENUM_MORE_MAGIC
} MagicLevel;
Затем пусть ваш конструктор примет параметр MagicLevel magic = MY_ENUM_NO_MAGIC
.
Я не совсем понимаю, но попробую ...
Значения по умолчанию применяются, когда у вас есть агрегатный инициализатор, который оставляет некоторые значения неуказанными. В этом случае по умолчанию bool будет ложным. В классе значение «по умолчанию» будет неинициализированным, то есть оно может быть любым значением и может меняться от запуска к запуску.
Если вас интересует, изменился ли тип bool, лучше всего сохранить отследите его с помощью второго bool по умолчанию false или используйте enum, представляющий 3 возможных состояния. Если вы действительно хотите 3 состояния, вы действительно не хотите bool.
Используйте большой boost :: optional. И не только для bools, но и для всех других мест, которые вы использовали некоторые грязные неинициализированные значения. Это используется так:
void function(optional<int> value) {
if (value)
std::cout << "value is defined: " << value.get() << "\n";
else
std::cout << "value is not defined\n";
}
А вот пример функции, возвращающей необязательный параметр:
struct MapClass {
map<string,int> m_map;
optional<int> getValue(string key) {
optional<int> result = none;
if (m_map.find(key) != m_map.end())
result = m_map[key];
return result;
}
}
class aclass
{
<stuff> lots of other things
bool mybool
bool ismyboolinit
void setmybool(bool b)
{
mybool = b;
ismyboolinit = true;
}
}