我遇到以下情况而重构旧代码:不复制它传递可选对象
// pointers to const are discouraged in our code base
void Do(Foo* exists, Foo* maybe_null) {
// does not change *exists or *maybe_null
}
int main() {
// ...
Do(&foos[i], test_both ? &bars[i] : nullptr);
// ...
HighOrderFunction(foos, bars, &Do);
// ...
}
所以,Do
被称为与的,而第二个可能不会,这取决于一些外界一个肯定存在2个Foo
对象测试。我正在尝试解决以下当前代码的问题:
第一个参数永远不会为空,因此它的指针属性从不使用。
我一般不喜欢使用null作为空值。
到目前为止,我想出了三种可能的解决方案,没有一个我完全满意,其中:
Do(const Foo&, Foo*)
:第二个参数有相同的问题,因为以前和现在的呼叫语法不再统一(foos[i]
和&bars[i]
),这可能会混淆读者。Do(const Foo&, const optional<Foo>&)
:第二个Foo
对象必须被复制来构造可选项。Do(const Foo&, optional<const Foo&>)
:由于不允许可选的引用类型,因此实际上并不工作。Do(const Foo&)
和Do(const Foo&, const Foo&)
过载:当我需要通过做一个函数指针
那么,有没有更好/更清洁的解决方案,我可以在这种情况下使用造成的问题?
(我用C一些性病增加像可选++ 11)
为'void Do(const Foo&)'和'void Do(const Foo&,const Foo&)'重载? – Unimportant
'test_both'是运行时值还是编译时值? – skypjack
@重要感谢您的评论。我忘了提及一个指向Do的指针需要不时地传递给更高阶的函数,所以过载不是一个选项。对于混淆抱歉,我将这些信息添加到了我的问题中。 –