Я бы использовал помеченный необязательный тип, например, Boost.Optional . Хотя вы можете использовать NULL для указателей, вы также можете использовать optional<char *>
и optional<int>
.
Если вы настаиваете на использовании NULL, вы можете решить, что некоторые значения int не являются допустимыми (например, (без знака) -1); Вы можете отклонить их, если пользователь предоставит их, и использовать их для обозначения «опция не указана».
Суть необязательного упаковщика заключается в следующем: логический флаг, указывающий, присутствует ли параметр, и обернутый тип данных, например ::10000
template <class T>
struct optional<T> {
T val;
bool none;
bool have() { return !none; }
optional() : none(true)
optional(T const& val) : val(val),none(false) {}
void operator=(T const& t) { none=false; val=t; }
// etc; make none and val private if you wish
};