0

在 C++/CLI 中实现指向成员结构的各种选项有哪些?

我已经实现了一些 2D 几何算法,这些算法基于 X 和 Y 坐标执行一些操作。我发现我经常为 X 轴和 Y 轴重复一次代码。一个例子是找到沿每个轴的最大和最小界限。

如果我一直在使用本机 C++,我可以使用指向 X 或 Y 成员(还有宽度、高度等)的指针并将其作为参数传递,这样我只需要实现每个算法一次。但是对于 C++/CLI,这是不可能的。我有哪些选择?我正在寻找一些高效、轻量级和简洁的东西。

4

2 回答 2

1

选项 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 作为属性公开,您可以让它们的 getter/setter 访问包含两个元素的成员数组,然后将该数组也公开为只读属性。虽然调用者不能修改数组属性,但它仍然可以修改其元素。

选项3:嗯,不是一个选项,真的。不要使用 .NET 反射按名称访问属性。运行时成本太高了。

于 2009-07-14T01:38:06.320 回答
1

我会将参数设为模板类型参数,并使用封装属性访问的函子。例如:

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

当然,这只有在你有足够多、足够长的算法来证明所有样板文件时才有意义。尽管包装器可以通过宏生成和引用,但可以大大减少代码行数。

于 2009-07-14T04:37:38.457 回答