Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将返回unique_ptr的函数转换为原始指针?_C++_C++11_Pointers - Fatal编程技术网

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

C++ 如何将返回unique_ptr的函数转换为原始指针?,c++,c++11,pointers,C++,C++11,Pointers,假设我要使用的遗留库中有一个函数需要函数指针作为输入 void LegacyFunction(int* (*func)(float, float), int a, float b); 但问题是,它期望函数的返回值是int-raw指针,而不是int-unique_ptr,这意味着只有在函数看起来像 int* MyFunc(float a, float b); 换句话说,如果我将MyFunc修改为 std::unique_ptr<int> MyFunc(float a, float

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

void LegacyFunction(int* (*func)(float, float), int a, float b);
但问题是,它期望函数的返回值是int-raw指针,而不是int-unique_ptr,这意味着只有在函数看起来像

int* MyFunc(float a, float b);
换句话说,如果我将MyFunc修改为

std::unique_ptr<int> MyFunc(float a, float b);
将出现编译错误。我知道如果函数使用的是普通的int指针,那么可以使用
get()
函数

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

对于函数指针输入是否有类似的解决方法?如果我必须用原始指针替换MyFunc的唯一\u 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;


获取包含的指针并放弃所有权,因此您已明确放弃了
unique\u 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;


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

MyFunc是运行时值还是在编译时已知?谁拥有指针?legacy library是所有者吗?遗留库是否破坏了指针?一个简单的lambda函数包装器似乎可以工作,但是,如果旧版没有以分配的方式释放返回的内存,您将有内存泄漏。您可以将
MyFunc
包装在lambda中。@krzaq编译时已知的是
MyFunc
运行时值,还是编译时已知的?谁拥有指针?legacy library是所有者吗?旧式库是否破坏了指针?一个简单的lambda函数包装器似乎可以工作,但如果旧式库没有以分配的相同方式释放返回的内存,则会导致内存泄漏。您可以在lambda中包装
MyFunc
。@krzaq编译时就知道了