C++ プロジェクトで GNU Scientific Library を使用しています。便宜上、C++ クラスを透過的にラップしたいと思いますgsl_vector*
(一連のドメイン固有の関数を追加し、インターフェイスを簡素化するため)。しかし、私はどのように対処するかについて困惑しています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);
}
};
さらに、2 つの関数があるとします。1 つは次のように定義されます。
int f(Vector& x) {
\\ do some math, e.g. x(0) = 0.0;
return 0;
}
もう 1 つは、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);
}
const と non-const の 2 つのポインターを持ち、Vector
それが const または non-const メンバーのどちらから初期化されたかを覚えておくことで、これを行うことができます。私の質問は、実行時チェックなしで実行できますか? 結局、すべての情報はコンパイル時に存在します。