문제

C ++/CLI에서 포인터 투 인원 구성을 구현하기위한 다양한 옵션은 무엇입니까?

X 및 Y 코디네이트를 기반으로 일부 동작을 수행하는 2D 지오메트리 알고리즘을 구현했습니다. x 축에 대해 한 번, y 축에 대해서는 한 번 종종 코드를 복제합니다. 예는 각 축을 따라 최대 및 최소 범위를 찾는 것입니다.

기본 C ++를 사용하고 있다면 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];
    };
    ...
};

이렇게하면 x를 shape.x 또는 shape.point [0]로, 그리고 shape.y는 shape.point [1]로 액세스 할 수 있습니다.

옵션 2 : X와 Y가 속성으로 노출되면 Getters/Setter가 두 요소의 멤버 배열에 액세스 한 다음 배열을 읽기 전용 속성으로 노출시킬 수 있습니다. 발신자는 배열 속성을 수정할 수 없지만 여전히 요소를 수정할 수 있습니다.

옵션 3 : 글쎄, 옵션이 아닙니다. 이름으로 속성에 액세스하기 위해 .NET 반사를 사용하지 마십시오. 런타임 비용이 너무 높습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top