递归到迭代而不重新绑定引用
Recursion to iteration without rebinding a reference
我有一个函数,它被削减,看起来像:
// bar is basically a linked list with extra stuff tagged on
void recurses(std::unique_ptr<bar> & P)
{
bool ok = decide_if_this_P_is_acceptable(P);
if (!ok)
{
recurses(P->getNextPtr());
return;
}
// Now do lots more stuff involving the reference P and P.reset()
}
bar 类公开了一个名为 getNextPtr()
的方法,该方法返回一个std::unique_ptr<bar>&
,然后可以将其传递回递归。
不幸的是,这吹毁了一些大输入的堆栈。我想将其转换为迭代,例如
void recurses(std::unique_ptr<bar> & P)
{
bar * N = nullptr;
for (;;)
{
bool ok = decide_if_this_P_is_acceptable(P);
if (ok)
{
break;
}
P = P->getNextPtr();
}
// P is now OK
// Now do lots more stuff involving the reference P and P.reset()
}
这当然拒绝编译,因为我们不能重新绑定引用(std::unique_ptr<bar> & P
)。
我怎样才能丢失递归,同时让函数的其余部分改变任何被认为是好的引用?
最简单的解决方案是使用std::reference_wrapper
而不是原始引用。它是可重新绑定的:
void recurses(std::reference_wrapper<std::unique_ptr<bar>>& P)
{
bar * N = nullptr;
for (;;)
{
bool ok = decide_if_this_P_is_acceptable(P);
if (ok)
{
break;
}
P = P.get().getNextPtr();
}
// P is now OK
// Now do lots more stuff involving the reference P and P.reset()
}
请注意.getNextPtr()
调用之前的其他.get()
,这些首先访问基础引用。您必须在所有成员函数调用中执行此操作。
或者,您可以在内部使用指针:
void recurses(std::unique_ptr<bar>& R)
{
std::unique_ptr<bar>* P = &R;
bar * N = nullptr;
for (;;)
{
bool ok = decide_if_this_P_is_acceptable(*P);
if (ok)
{
break;
}
P = &P->getNextPtr();
}
// P is now OK
// Now do lots more stuff involving the reference P and P.reset()
}
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 了解C++如何返回引用并绑定到引用
- 模板允许左值与右值引用绑定
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- C++通过绑定到引用成员而缩短临时变量寿命?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 对结构成员的临时绑定引用
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 为什么我可以在初始化引用后重新绑定引用?
- 为什么按引用传入会导致绑定引用类型错误
- 返回非常量引用会导致绑定引用错误
- 递归到迭代而不重新绑定引用
- 类型绑定引用中的限定符和 const 类型的初始值设定项中删除
- 为什么C++不允许重新绑定引用?