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,那将是一个讽刺.
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保护; 如果你能避免它,那不是一个好主意.