如果您遇到某些参数仅成对有意义的情况,请使用重载函数。
所以代替例如(对不起,现在没有更好的例子)
// Adds a new TODO. Either this is a low-prio TODO with no defined
// deadline, xor a deadlined TODO for which year, month, day must
// be passed.
void add_todo (std::string description, int year=-1, int month=-1, int day=-1);
做
void add_todo (std::string description, int year, month, day);
void add_todo (std::string description) {
add_todo(description, -1, -1, -1);
}
因此要强制执行两个可能的调用签名中的一个且仅一个。
当然,最好添加更多结构,例如Date
. 但即便如此,我也不建议Date
仅仅为了它而使“可空”:
void add_todo (std::string description, Date = Date::None); // <-- I wouldn't
反而
void add_todo (std::string description);
void add_todo (std::string description, Date deadline);
或者有时没有过载,也没有默认值
void add_todo (std::string description);
void add_deadlined_todo (std::string description, Date deadline);