假设我想使用遗留库中的一个函数,它需要一个函数指针作为输入
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 int
,LegacyFunction
必须使用delete retval;
;如果使用了new int[x]
,则必须使用 delete[] retval;
).
The release
method获取包含的指针并放弃所有权,因此您已明确放弃 unique_ptr
的保护;如果可以避免,这不是一个好主意。
关于c++ - 如何将返回 unique_ptr 的函数转换为原始指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40476145/