为gsl_vector *创建一个C ++包装器,它与GSL的根查找工具很好地配合使用(例如gsl_multiroot_function_fdf)

时间:2016-01-05 14:20:43

标签: c++ wrapper smart-pointers gsl raii

从广义上讲,我正在寻找处理在使用智能包装器替换T *时内部调用的遗留函数f(T*)的最佳方法。在我的情况下,Tgsl_vector,我正在创建一个存储Vector的类gsl_vector*。该类既作为包装器,实现重载的数字运算符,又作为智能指针,处理gsl_vector*指针的资源分配和释放。但是,当使用gsl的数字根查找工具时,我遇到了一个小问题。这个过程要求我创建一个对象gsl_multiroot_function_fdf,它是一个包含函数指针的结构,如

int (* fdf) (const gsl_vector * x, void * params, gsl_vector * f, gsl_matrix * J)

此函数指针在GSL的内部算法中调用,因此我无法控制传入的gsl_vector*gsl_matrix*,特别是我不拥有它们。我确实可以完全控制这些函数指针引用的函数,我想利用我的Vector(和Matrix)包装器,因为我有很多计算来做包装器简化。最简单的方法是创建新的VectorMatrix对象并将其数据复制到fJ,但所有这些复制都是不必要且缓慢的。最好是包装fJ并直接修改它们。通过我现在拥有的包装器的简单实现,如果在这些指针中创建一个包装器,但是当包装器超出范围时,它们的内存将被释放。

在这种情况下,是否有可接受的最佳做法,我希望我可以完全强制执行所有gsl_vector*gsl_matrix*数据的RAII封装,但由于遗留代码而无法实现?我现在的解决方案是在我的softwrapVector类中使用典型的假布尔Matrix,并使用命名构造函数

static Vector SoftWrap(gsl_vector* v);

使用Vector创建softwrap=true。当此布尔值为true时,不会在析构函数中释放内存。这种方法似乎有效,但也许它在某种程度上是愚蠢的,我没有预料到。

一个单独但可能相关的问题是如何处理const gsl_vector*个对象。已经存在单独的stackoverflow问题(建议:ConstVector类,模板等)。

0 个答案:

没有答案