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

use*_*089 1 c++ pointers c++11

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

void LegacyFunction(int* (*func)(float, float), int a, float b);
Run Code Online (Sandbox Code Playgroud)

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

int* MyFunc(float a, float b);
Run Code Online (Sandbox Code Playgroud)

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

std::unique_ptr<int> MyFunc(float a, float b);
Run Code Online (Sandbox Code Playgroud)

并将其传递给遗留库函数,如

LegacyFunction(MyFunc, 1, 2.0f);
Run Code Online (Sandbox Code Playgroud)

会有编译错误.我知道如果该函数采用通常的int指针,可以使用get()像这样的函数进行一些解决方法

std::unique_ptr<int> a;
LegacyFunctionRawPointer(a.get(), 1, 2.0f);
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ger 5

lambda函数应该有效,例如:

LegacyFunction([](float a, float b) { return MyFunc(a, b).release(); }, 1, 2.0f);
Run Code Online (Sandbox Code Playgroud)

但只有当LegacyFunction自然删除/释放MyFunc分配了适当操作的内存时(如果MyFunc使用new int,LegacyFunction必须使用delete retval;;如果使用new int[x],则必须使用delete[] retval;).

release方法获取包含的指针并放弃所有权,因此您明确放弃了unique_ptr保护; 如果你能避免它,那不是一个好主意.