gpt4 book ai didi

c++ - std::unique_ptr 结合自定义自由操作的使用

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:39 24 4
gpt4 key购买 nike

我有一个带有构造函数和析构函数的类以及两者的以下代码:

class propagation_module{
private:
gsl_interp_accel *xa;
interp2d_spline *interp_s;
public:
propagation_module()
{
std::vector<int> p_N = {1, 2, 3}, z_vec = {1, 2, 3};
xa = gsl_interp_accel_alloc();
interp_s = interp2d_spline_alloc(interp2d_bicubic, p_N.size(), z_vec.size());
}
~propagation_module(){
gsl_interp_accel_free(xa);
interp2d_spline_free(interp_s);
}
}

我想用 std::unique_ptr 变量替换指针,但我不明白如何实现自由函数。根据其他一些问题,以下方式应该有效:

class propagation_module
{
private:
std::unique_ptr<gls_interp_accel, decltype(&gsl_interp_accel_free)> xa;
std::unique_ptr<interp2d_spline, decltype(&interp2d_spline_free)> interp_s;
public:
propagation_module()
{
//Same as above
}
//No destructor necessary
}

这是正确的,还是我忘记了什么?

最佳答案

你已经完成了一半。默认情况下,std::unique_ptr 将在 unique_ptr 创建时没有传入时默认构造其删除器。您为删除器提供了正确的类型,但您还需要提供它们的:

public:
propagation_module()
{
std::vector<int> p_N = {1, 2, 3}, z_vec = {1, 2, 3};
xa = {gsl_interp_accel_alloc(), &gsl_interp_accel_free};
interp_s = {interp2d_spline_alloc(interp2d_bicubic, p_N.size(), z_vec.size()), &interp2d_spline_free};
}

或者,如果您不想在每次创建唯一指针时都提供正确的删除器,您可以创建默认可构造的包装器来调用正确的函数:

struct GslInterpAccelFree
{
void operator() (gsl_interp_accel *p) const { gsl_interp_accel_free(p); }
};

struct Interp2dSplineFree
{
void operator() (interp2d_spline *p) const { interp2d_spline_free(p); }
};

class propagation_module
{
private:
std::unique_ptr<gls_interp_accel, GslInterpAccelFree> xa;
std::unique_ptr<interp2d_spline, Interp2dSplineFree> interp_s;
public:
propagation_module()
{
std::vector<int> p_N = {1, 2, 3}, z_vec = {1, 2, 3};
xa.reset(gsl_interp_accel_alloc());
interp_s.reset(interp2d_spline_alloc(interp2d_bicubic, p_N.size(), z_vec.size()));
}
//No destructor necessary
}

关于c++ - std::unique_ptr 结合自定义自由操作的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48223224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com