将 const 引用转换为智能指针而不复制
convert const reference to smart pointer without copying
我有一个 class 对象,复制起来非常昂贵。我编写了一个函数,它将对 Object 的 const 引用作为函数参数。现在在函数中我需要调用一个函数,它接受一个指向对象的共享指针。如何在不至少复制整个对象一次的情况下调用此函数?
可以使用共享指针的别名构造函数:
void f(std::shared_ptr<X>); // the other function
void my_function(const X& x)
{
f(std::shared_ptr<X>(nullptr, &x));
}
但请注意,目前尚不清楚这是否正确:在这种情况下,f
以下的任何内容都不会在您的函数中获得超过 x
的实际生命周期的所有权份额。如果 f
设计正确,那么按理说它需要一个共享指针,以便它 可以 任意取出额外的生命周期份额,所以我只会在极端情况下使用它注意。
唯一的 "correct" 解决方案(除了更改函数的签名之外)是使用共享指针实际管理相关对象的生命周期,并且可能添加一个 enable_shared_from_this
工具到 X
:
void my_function(const X& x)
{
f(x.shared_from_this()); // X must be changed to support this
}
获取引用的地址,执行 const_cast 以摆脱 const,然后将空删除器与指向智能指针构造函数的指针一起传递。空删除器是不执行任何操作的删除器。即
std::shared_ptr(const_cast<my_type*>(&myRef), [] (my_type *) { })
请注意,如果您传递给的函数实际上希望对参数执行生命周期管理,您可能最终需要复制该对象。
我有一个 class 对象,复制起来非常昂贵。我编写了一个函数,它将对 Object 的 const 引用作为函数参数。现在在函数中我需要调用一个函数,它接受一个指向对象的共享指针。如何在不至少复制整个对象一次的情况下调用此函数?
可以使用共享指针的别名构造函数:
void f(std::shared_ptr<X>); // the other function
void my_function(const X& x)
{
f(std::shared_ptr<X>(nullptr, &x));
}
但请注意,目前尚不清楚这是否正确:在这种情况下,f
以下的任何内容都不会在您的函数中获得超过 x
的实际生命周期的所有权份额。如果 f
设计正确,那么按理说它需要一个共享指针,以便它 可以 任意取出额外的生命周期份额,所以我只会在极端情况下使用它注意。
唯一的 "correct" 解决方案(除了更改函数的签名之外)是使用共享指针实际管理相关对象的生命周期,并且可能添加一个 enable_shared_from_this
工具到 X
:
void my_function(const X& x)
{
f(x.shared_from_this()); // X must be changed to support this
}
获取引用的地址,执行 const_cast 以摆脱 const,然后将空删除器与指向智能指针构造函数的指针一起传递。空删除器是不执行任何操作的删除器。即
std::shared_ptr(const_cast<my_type*>(&myRef), [] (my_type *) { })
请注意,如果您传递给的函数实际上希望对参数执行生命周期管理,您可能最终需要复制该对象。