メンバーにC ++ / CLIのポインタ
-
13-09-2019 - |
質問
C ++ / CLIで構築へのポインタメンバを実装するためのさまざまなオプションは何ですか?
Iは、XとY座標に基づいて、いくつかのアクションを実行するいくつかの2D幾何学アルゴリズムを実装しています。私は頻繁に、X軸に一度のコードを複製し、一度Y軸のためだということを見つけます。例では、各軸に沿った最大値と最小境界を見つけることである。
は、私は、ネイティブC ++を使用して、Iは、XまたはYのメンバへのポインタを使用する(また、高さなど、幅)は、私は一度だけ、各アルゴリズムを実装する必要があるようにパラメータとして渡されている可能性がありました。しかし、C ++ / CLIで、これは不可能です。私のオプションは何ですか?私は、効率的な何か、軽量かつ簡潔を探しています。
解決
私の代わりに、引数テンプレート型引数を作成し、プロパティへのアクセスをカプセル化ファンクタを使用すると思います。例えば:ます。
ref class Point {
property int X;
property int Y;
};
struct Point_X_accessor
{
static int get(Point^ p) { return p->X; }
static int set(Point^ p, int value) { p->X = value; }
};
struct Point_Y_accessor
{
static int get(Point^ p) { return p->Y; }
static int set(Point^ p, int value) { p->Y = value; }
};
template <class PointAccessor>
int some_algorithm(Point^ p) { ... }
some_algorithm<Point_X_accessor>(p);
some_algorithm<Point_Y_accessor>(p);
あなたはすべての決まり文句を正当化するために十分に多く、十分に長いのアルゴリズムを持っている場合は、もちろん、これはのみ意味があります。ラッパーは、両方のコードの行にかなり減らし、マクロを介して生成され、参照することができたのに。
他のヒント
オプション1:XとYは、パブリックメンバとして公開されている場合は、匿名組合の一部としてそれらを定義することができ、例えばます:
class Shape {
public:
union {
struct { double X; double Y; };
double point[2];
};
...
};
これは、あなたがshape.Xまたはshape.point [0]、およびいずれかとしてXにアクセスすることができます同様に、shape.Y shape.pointとして[1]。
オプション2:XとYは、プロパティとして公開されている場合は、あなたが彼らのゲッター/セッターは、二つの要素のメンバーアレイにアクセスする必要があり、その後、あまりにも読み取り専用のプロパティとして配列を公開することができます。呼び出し側が配列プロパティを変更することはできませんが、それはまだその要素を変更することができます。
オプション3:まあ、ないオプション、本当に。名前でプロパティにアクセスするには、.NETリフレクションを使用しないでください。ランタイムコストがあまりにも高くなります。