0

我想知道让一个方法返回一个 r 值。具体来说,我想知道是否有办法使用重载的运算符来做到这一点。我有这个代码:

struct vec4 {
    float x;
    float y;
    float z;
    float w;
    ...
    inline float operator [] (int i)
    {
            switch (i) {
            case 0:
                    return this->x;
            case 1:
                    return this->y;
            case 2:
                    return this->z;
            case 3:
                    return this->w;
            default:
                    exit(1);
                    return 0;
            }
    }
};

我怎样才能改变它,以便我可以使用一些东西来达到

vec4 v;
...
v[2] = 5.0f;

我听说过 C++11 中的右值引用,它们可能是一个潜在的解决方案吗?

编辑:我找到了一种方法来输入我的实际代码。

4

3 回答 3

6

为此不需要 C++11。只要有:

float & operator[](std::size_t i) { return data[i]; }

现在你可以说v[2] = 5;一切都很好。

如果您愿意,您可以添加一个不使用引用且可用于读取值的常量重载。

float operator[](std::size_t i) const { return data[i]; }

您唯一可能考虑使用右值成员函数限定符的情况是,如果您想允许分配临时成员:

vec4{}[2] = 5;

在这种情况下,您仍然返回一个左值引用,但您必须限定成员函数:

float & operator[](std::size_t i) && { return data[i]; }
//                               ^^^^
于 2012-12-31T16:36:20.317 回答
4

对于你想要完成的事情,你显然想要返回一个左值,而不是一个右值。这实际上很容易:

float &operator[](size_t i) { return data[i]; }

请注意,当您在类定义中定义函数时,这inline是多余的——在类定义中定义函数使其成为inline默认值。

于 2012-12-31T16:37:27.810 回答
4

您可以简单地使用:

float& operator [] (int index)
{
    return data [i];
}

这使您可以编写v[2] = 5.0f;并且它将按预期工作。这里不需要 r 值引用。

您还应该添加一个 const-overload 来检索该值,如下所示:

float operator [] (int index) const
{
    return data [i];
}

这将允许您编写如下代码:const vec4 v; float x = v[1];.

于 2012-12-31T16:36:07.913 回答