传递可选对象而无需复制它
Pass optional object without copying it
我在重构旧代码时遇到以下情况:
// 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
带有两个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&)
超载:当我需要通过功能指针
将DO通过时会引起问题
那么,在这种情况下,我可以使用更好/清洁的解决方案吗?
(我使用的是C 11,以及一些诸如可选的类别添加)
使Do
成为函数,而不仅仅是函数。
struct Do
{
void operator()(const Foo &must_be_provided);
void operator()(const Foo &must_be_provided, const Foo &maybe_unneeded);
};
,然后在实施两种形式的Do::operator()
之后,
void some_function(Do f)
{
// assume access to foos and bars here
if (test_both) // assume determined at run time
f(foos[i]);
else
f(foos[i], bars[i]);
}
请注意,函数可以按值,参考或其地址传递,或者可以以指针传递(尽管调用函数的语法都会有些变化)。
如果您需要可选参考,则可以使用std::reference_wrapper<Foo>
:
Do(const Foo&, optional<std::reference_wrapper<const Foo>>)
将避免复制对象。并将使该函数正式接受参考。
确保创建了一个reference_wrapper
对象。但这很轻。大多数实现只会掩盖指针。
相关文章:
- 将包含不可复制对象的对插入到映射中
- 通用参考 l 值不复制对象
- 为什么具有 2 个参数参数的构造函数接受复制对象作为 1 个参数参数?
- 为什么从引用创建共享指针会复制对象?
- 当(且仅当)对象具有复制构造函数时,如何复制对象?
- 我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
- 如何复制对象
- 如何构造不可移动不可复制对象的元组?
- 不可复制对象数组的 consexpr 初始化?
- 提升::可选与标准::不可复制对象的可选
- 如何在C++中通过引用复制对象
- 从指针复制对象
- 删除浅表的复制对象和源对象
- 使用realloc可以安全地重新分配琐碎的可复制对象的存储吗
- C 返回复制对象
- 如何将智能指针作为类属性来复制对象
- 为什么在复制对象时忽略顶级常量
- std::shared_ptr 在复制对象时导致问题
- 安全复制对象的替代方案
- 当类包含boost::container::flat_set时,复制对象时出错