我在我的 C++ 项目中使用 GNU 科学库。为了方便起见,我想透明地包装gsl_vector*
在一个 C++ 类中(以添加一堆特定于域的函数并简化接口)。但我对如何处理感到困惑const gsl_vector*
。让我解释。让我从这个简约的包装器开始。
class Vector {
gsl_vector* vector_;
public:
Vector(gsl_vector* vector): vector_(vector) {}
double& operator()(int i) {
return *gsl_vector_ptr(vector_, i);
}
};
进一步假设我有两个功能。一是定义如下:
int f(Vector& x) {
\\ do some math, e.g. x(0) = 0.0;
return 0;
}
另一种是必须使用 GSL 类型的回调函数,定义如下:
int gsl_f(gsl_vector* x) {
Vector xx(x);
return f(xx);
}
这工作正常。现在,假设回调有一个常量签名:
int gsl_f(const gsl_vector* x);
然后我可以相应地重新定义我的Vector
类和我的f
功能:
class Vector {
const gsl_vector* vector_;
public:
Vector(const gsl_vector* vector): vector_(vector) {}
const double& operator()(int i) const {
return *gsl_vector_const_ptr(vector_, i);
}
};
int f(const Vector& x) {
\\ do some math
return 0;
}
也有效。现在,我希望我的包装类适合这两种情况。例如,我希望能够执行以下操作,同时保持 const 的安全性:
int f(const Vector& x, Vector& y) {
\\ do some math
return 0;
}
int gsl_f(const gsl_vector* x, gsl_vector* y) {
Vector yy(y);
return f(x, yy);
}
我可以通过使用Vector
带有两个指针(const 和 non-const)的 a 来做到这一点,并记住它是从 const 成员还是非常量成员初始化的。我的问题是,我可以在没有运行时检查的情况下做到这一点吗?毕竟,所有信息在编译时就在那里。