在C 中获得相反的结构字段
Get opposite structure field in C++
让我们假设我有以下结构:
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参数来判断哪个目的是运行。
相关文章:
- 将结构字段的类型展开为可变模板参数
- 结构字段名称与 GDB 中的 STL 数组冲突
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 如何为结构字段动态分配字符空间
- 实例化时结构字段中的默认值
- 如何使用函数的输出初始化 const 数组结构字段?
- 无法访问 Arduino 结构字段。错误"退出状态 1。xxxx 不命名类型"
- 列出常量和数组结构字段的初始化
- 如何使用 gtest 构造检查存储在向量中的结构(字段)?
- 将带有结构字段的结构从C 返回到C#PINVOKE
- 嵌套结构字段的 clang 格式规则
- 如何匹配通过引用传递给模拟函数的结构字段
- 在C 中获得相反的结构字段
- 如何为我的 Vulkan 类创建此通用数据结构字段
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- 在编译时使用模板在跨结构字段中迭代
- 正在取消引用自定义结构字段的迭代器
- 结构字段上的智能指针
- 使用C预处理器在结构字段上进行迭代
- 结构字段的默认初始化行为