在C 中获得相反的结构字段

Get opposite structure field in C++

本文关键字:结构 字段      更新时间:2023-10-16

让我们假设我有以下结构:

struct Point
{double _x, _y;};
struct Segment
{Point _p1, _p2;};
typedef Point Segment::* const SegmentEnd;

现在,我想介绍将通过与提供的SegmentEnd相关的片段进行扩展的功能。这意味着更改与提供的SegmentEnd相反的坐标。我该怎么办?

这是我要更改提供的SegmentEnd的代码,但是我需要更改相反的代码:

void scale(Segment& segment, SegmentEnd end, const double& scaleVal)
{
    Point& p(segment.*end);
    p._x = scaleVal*p._x;
    p._y = scaleVal*p._y;
}

您可以定义返回另一端的函数:

SegmentEnd opposite(SegmentEnd e)
{
    return e == &Segment::_p1 ? &Segment::_p2 : &Segment::_p1;
}
// ...
Point& one(segment.*end);
Point& other(segment.*opposite(end));

您不能简单地做这样的事情:

void scale(Segment& segment, bool inverted, const double& scaleVal)
{
    if (!inverted) {
        // scale segment._p1 with respect to segment._p2
    } else {
        // scale segment._p2 with respect to segment._p1
    }
}

那么您甚至不需要将指针带给成员。

参数也可以是枚举("方向"),等等。

您可以争辩说,使用指向成员的指针,您期望保存该分支机构,但是在您的情况下并非如此,因为您仍然需要检查地址以确定已发送了哪个点。

您可以通过提供两个要点,缩放一个和另一个作为参考来保存分支:

void scale(Segment& segment, SegmentEnd scaled, SegmentEnd reference, const double& scaleVal)
{
    // scale segment.*scaled with reflect to segment.*reference
}

并适当致电:

scale(segment, Segment::_p1, Segment::_p2, value);
scale(segment, Segment::_p2, Segment::_p1, value);

(或在这种情况下直接传递点)

如果您要想要的是访问另一个成员(您没有作为参数提供的成员),您可能可以将与您发送的元素的地址进行比较,说_p1,如果与之匹配,您知道要访问_p2等。但是,如果您想要最少的可读性,则应真正以另一种方式解决问题。

我从未遇到过指针到会员访问操作员可以改善我的代码的情况,我相信不会通过在此处阅读您的帖子来改变。

编辑:因此,替代答案是在问题的评论中(Francois的忍者),使用枚举或bool参数来判断哪个目的是运行。