假设我想要使用的遗留库中有一个函数需要函数指针作为输入
DalSoft.RestClient
但问题是它期望函数的返回值是一个int原始指针而不是int unique_ptr,这意味着如果我的函数看起来像
我只能编译它void LegacyFunction(int* (*func)(float, float), int a, float b);
换句话说,如果我将MyFunc修改为
int* MyFunc(float a, float b);
并将其传递给遗留库函数,如
std::unique_ptr<int> MyFunc(float a, float b);
会出现编译错误。我知道如果该函数采用通常的int指针,可以使用LegacyFunction(MyFunc, 1, 2.0f);
函数进行一些解决方法,如
get()
是否有类似的函数指针输入解决方法?如果我必须用原始指针替换MyFunc的unique_ptr,那将是一个讽刺。
答案 0 :(得分:5)
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_ptr
)。
The release
method获取所包含的指针并放弃所有权,因此您明确放弃了{{1}}的保护;如果你能避免它,那不是一个好主意。