c++ - 如何将返回 unique_ptr 的函数转换为原始指针?

标签 c++ c++11 pointers

假设我想使用遗留库中的一个函数,它需要一个函数指针作为输入

void LegacyFunction(int* (*func)(float, float), int a, float b);

但问题是它期望函数的返回值是一个 int 原始指针而不是一个 int unique_ptr,这意味着我只能在我的函数看起来像这样的情况下才能编译它

int* MyFunc(float a, float b);

换句话说,如果我将 MyFunc 修改为

std::unique_ptr<int> MyFunc(float a, float b);

并将其传递到遗留库函数中

LegacyFunction(MyFunc, 1, 2.0f);

会出现编译错误。我知道如果该函数采用普通的 int 指针,则可以使用 get() 函数来解决一些问题,例如

std::unique_ptr<int> a;
LegacyFunctionRawPointer(a.get(), 1, 2.0f);

函数指针输入是否有类似的解决方法?如果我必须用原始指针替换 MyFunc 的 unique_ptr,那将是一种讽刺。

最佳答案

lambda 函数应该可以工作,例如:

LegacyFunction([](float a, float b) { return MyFunc(a, b).release(); }, 1, 2.0f);

但前提是 LegacyFunction 会自然地删除/释放 MyFunc 通过适当操作分配的内存(所以如果 MyFunc 使用了 new intLegacyFunction 必须使用delete retval;;如果使用了new int[x],则必须使用 delete[] retval;).

The release method获取包含的指针并放弃所有权,因此您已明确放弃 unique_ptr 的保护;如果可以避免,这不是一个好主意。

关于c++ - 如何将返回 unique_ptr 的函数转换为原始指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40476145/

相关文章:

c++ - 为什么类中的initializer_list没有声明为 "const std::initializer_list & li"?

c++ - 指向虚类的指针

c++ - 为什么声明为指向字符的指针并分配了 2 个字节大小的 String 的大小会被更改?

c++ - 混合使用 C++ 和程序集无法将多个参数从 C++ 函数传递给程序集

c++ - 运行时类型信息的奇怪行为

c++ - 传递带有默认值的函数作为忽略它们的参数

C struct into array of struct pointers 编译错误

c++ - 再次保护自赋值

c++ - GDI+ 图形对象 - 使用 GDI 直接绘制到 DC 时抗锯齿丢失

c++ - 需要帮助修复奇怪的 cin 行为