在 C++/CLI 中实现指向成员结构的各种选项有哪些?
我已经实现了一些 2D 几何算法,这些算法基于 X 和 Y 坐标执行一些操作。我发现我经常为 X 轴和 Y 轴重复一次代码。一个例子是找到沿每个轴的最大和最小界限。
如果我一直在使用本机 C++,我可以使用指向 X 或 Y 成员(还有宽度、高度等)的指针并将其作为参数传递,这样我只需要实现每个算法一次。但是对于 C++/CLI,这是不可能的。我有哪些选择?我正在寻找一些高效、轻量级和简洁的东西。
在 C++/CLI 中实现指向成员结构的各种选项有哪些?
我已经实现了一些 2D 几何算法,这些算法基于 X 和 Y 坐标执行一些操作。我发现我经常为 X 轴和 Y 轴重复一次代码。一个例子是找到沿每个轴的最大和最小界限。
如果我一直在使用本机 C++,我可以使用指向 X 或 Y 成员(还有宽度、高度等)的指针并将其作为参数传递,这样我只需要实现每个算法一次。但是对于 C++/CLI,这是不可能的。我有哪些选择?我正在寻找一些高效、轻量级和简洁的东西。
选项 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 反射按名称访问属性。运行时成本太高了。
我会将参数设为模板类型参数,并使用封装属性访问的函子。例如:
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);
当然,这只有在你有足够多、足够长的算法来证明所有样板文件时才有意义。尽管包装器可以通过宏生成和引用,但可以大大减少代码行数。