结构中的C ++重载operator()

闯将

这是来自Box2d物理引擎的b2Math.h的代码。

struct b2Vec2
{   ...
    /// Read from and indexed element.
    float operator () (int i) const
    {
         return (&x)[i];
    }
    /// Write to an indexed element.
    float operator () (int i)
    {
         return (&x)[i];
    }
    ...
    float x, y;
}

为什么我们不能只使用SomeVector.x和SomeVector.y来读取/写入矢量坐标?线路的实际return (&x)[i];运作方式如何我的意思是,对结构的x组件的引用对我来说还不清楚数组制动器[]。

预先感谢您的答复。

路易·兰霍兹

这是来自Box2d物理引擎的b2Math.h的代码。

您发布的Box2D源代码的复制和粘贴中似乎存在错误。特别是,在非常量方法中似乎缺少了“&”号。

另外,此代码段似乎来自当前2.3.2发布的代码之外的其他代码库。

这是来自GitHub上Box2D 2.3.2的部分

/// Read from and indexed element.
float32 operator () (int32 i) const
{
    return (&x)[i];
}

/// Write to an indexed element.
float32& operator () (int32 i)
{
    return (&x)[i];
}

为什么我们不能只使用SomeVector.x和SomeVector.y来读取/写入矢量坐标?

我们可以并且通常这样做。

但是,Box2D中有一些代码(b2AABB::RayCast特别是)似乎是从一种算法(b2AABB::RayCast说“来自实时碰撞检测,p179”的注释)中编写的,该算法在x和y上迭代为数组下标零和一。我猜想Erin Cato(Box2D的作者)是通过以下方式实现这些运算符的:(a)使访问在样式上更符合算法,(b)使访问有效,(c)使访问在看起来高效的方式。我可以确认它至少可以正常工作。

我有自己的Box2D分支,在其中重写了这些运算符。我将其接口更改为使用[](而不是()),并将其实现更改为使用一条switch语句来显式访问xy后者是我为避免C ++标准可能会导致的不确定行为。

这里有一个片段是什么我实现的样子,而不是相关的部分(和请注意,我不主张这是完美的还是不错的,甚至,只是它的一个替代实现,它的作品,它应该清楚地依赖于定义的行为) :

/// Accesses element by index.
/// @param i Index (0 for x, 1 for y).
auto operator[] (size_type i) const
{
    assert(i < max_size());
    switch (i)
    {
        case 0: return x;
        case 1: return y;
        default: break;
    }
    return x;
}

/// Accesses element by index.
/// @param i Index (0 for x, 1 for y).
auto& operator[] (size_type i)
{
    assert(i < max_size());
    switch (i)
    {
        case 0: return x;
        case 1: return y;
        default: break;
    }
    return x;
}

以及行返回(&x)[i]的实际方式;作品?

正如我在上面暗示的那样,我之前已经研究了这个确切的问题。

当结构的x和y成员变量的内存布局与具有两个浮点数的数组相同时,该函数起作用。它通常会这样做。因此&符(&)获取x参数的地址,然后将该地址视为数组开头的地址,然后由它进行索引i

不过,就C ++标准而言,我认为这不是定义的行为。但是,对于我的口味而言,定义不够明确。

希望这能回答您的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++重载operator =以获得左右手重载

在C ++中,为什么我们可以重载`operator->`而不能重载`operator。

重载operator +和Segmentation故障C ++

C++ #include 和 operator<< 重载错误

operator << C ++中模板类中成员类型的重载

C++ 中的 operator<< 重载未按预期工作

为什么我的C ++类中的重载operator +不需要实现为operator-?

重载operator +以添加存储在向量中的类对象

模板矩阵类中的operator *的多重重载

类中的字符串memebrs重载operator >>时出错

'std :: cin >>'中'operator >>'的模棱两可的重载

同一类中的多个Operator()重载

使用类和int参数作为模板的C ++重载operator +

C ++重载operator +,复制构造函数出现问题

C ++将类的重载operator()传递为函数指针

重载operator== c ++时获取SIGSEGV(分段错误)

= operator的重载

在C ++中,您是否需要在两个方向上重载operator ==?

operator []如何在C ++中工作(在用户定义的objecs上重载)?

在C ++中不匹配'operator <<'(包括字符串和ostream以及重载<<)

在不影响操作数的情况下为结构重载 operator+

错误:使用复制和交换习惯的交换函数中的'operator ='含糊不清的重载

在具有 2 个模板的模板类中重载 operator+

'operator ++(int)&'运算符重载中的'&'是什么意思?

为std :: unordered_map中的const std :: reference_wrapper重载operator ==

如何在main.cpp中为普通类重载operator>

矩阵模板类中的重载运算符* =和Operator +

如何解决字符串中'operator ='的模棱两可的重载

(c ++ 14)operator <<重载无法按智能指针向量的预期工作