Frage

Was sind die verschiedenen Optionen ein Zeiger-to-Mitglied implementieren in C konstruieren ++ / CLI?

Ich habe einige 2D-Geometrie-Algorithmen implementiert, die einige Aktionen auf Basis von X- und Y-Koordinaten durchzuführen. Ich finde, dass ich häufig Code duplizieren bin einmal für die X-Achse und einmal für die Y-Achse. Ein Beispiel ist entlang jeder Achse die maximalen und minimalen Grenzen zu finden.

Habe ich native C ++ gewesen mit, ich einen Zeiger auf dem X- oder Y-Element (auch Breite, Höhe und so weiter) und gab ihnen als Parameter haben könnte verwendet, so dass ich implementieren muß jeden Algorithmus nur einmal. Aber mit C ++ / CLI, ist dies nicht möglich. Was sind meine Optionen? Ich bin auf der Suche nach etwas, effizient, leicht und kurz und bündig.

War es hilfreich?

Lösung

würde ich das Argument ein Template-Typ Argument, stattdessen verwenden functors die Eigenschaft Zugang zu kapseln. Z.

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);

Natürlich ist dies nur dann sinnvoll, wenn Sie ausreichend viele ausreichend langen Algorithmen haben alle Textvorschlag zu rechtfertigen. Obwohl die Wrapper beide erzeugt und über ein Makro referenziert werden können, auf Codezeilen Abholzen eine ganze Menge.

Andere Tipps

Option 1: wenn X und Y als öffentliche Mitglieder ausgesetzt sind, können Sie sie als Teil einer anonymen definieren könnte, z:

class Shape {
public:
    union {
        struct { double X; double Y; };
        double point[2];
    };
    ...
};

Auf diese Weise können Sie X zugreifen, als entweder shape.X oder shape.point [0], und in ähnlicher Weise, wie shape.Y shape.point [1].

Option 2: Wenn X und Y als Eigenschaften ausgesetzt sind, können Sie ihre Getter / Setter haben könnten ein Element Array aus zwei Elementen zuzugreifen, und dann das Array als schreibgeschützte zu Eigenschaft aus. Während der Anrufer die Array-Eigenschaft nicht ändern kann, kann es immer noch seine Elemente ändern.

Option 3: gut, keine Option, wirklich. Nicht die Eigenschaften verwenden .NET Reflexion von Namen zuzugreifen. Die Laufzeitkosten sind viel zu hoch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top