在C ++中获取相反的结构字段

时间:2017-12-06 12:19:30

标签: c++ pointer-to-member

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

String bucketName = "xxxx.appspot.com";
GcsService gcsService = GcsServiceFactory.createGcsService();                   
gcsService.delete(new GcsFilename(bucketName,"images/123.jpg"));

现在我想介绍一个函数,该函数可以根据提供的struct Point {double _x, _y;}; struct Segment {Point _p1, _p2;}; typedef Point Segment::* const SegmentEnd; 来缩放细分。这意味着改变与提供的SegmentEnd相反的坐标。我该怎么办?

以下是我更改提供的SegmentEnd所做的代码,但我需要更改相反的代码:

SegmentEnd

3 个答案:

答案 0 :(得分:3)

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

{{1}}

答案 1 :(得分:1)

如果你要求的是访问另一个成员(你没有提供的那个成员作为参数),你可能会做一些比较你发送的元素的地址,比如_p1,如果匹配的话你知道你想要访问_p2而不是等等。但如果你想要一点点的可读性,你应该以另一种方式解决你的问题。

我从未遇到指向成员访问操作符可以改进我的代码的情况,我相信通过阅读你的帖子不会改变。

编辑: 所以另一个答案是在问题的评论中(ninjad by Francois),使用enum或bool参数来判断操作的结束。

答案 2 :(得分:1)

你不能简单地做一些事情:

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
    }
}

然后你甚至不需要指向成员的指针。

param可以是枚举("方向")等等。

您可能会争辩说,使用指向成员的指针,您希望保存分支,但在您的情况下情况并非如此,因为您仍需要检查地址以确定已发送的点。

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

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

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