当前位置: 首页 > 知识库问答 >
问题:

使用重载运算符[]更改结构的值

宗政昱
2023-03-14

我正在尝试制作一个自定义的矢量数据结构。它将始终包含4个浮点值。我想让它通过属性名访问,但也可以通过运算符[],这样它也可以通过索引访问,比如数组。它应该可以通过运算符[]进行编辑,就像向量或数组一样。到目前为止,我已经做到了:

struct vec4
{
    float* x;
    float* y;
    float* z;
    float* w;

    vec4() : data(4, 0.0f) { Init(); }
    vec4(float x, float y, float z, float w)
    {
        data = std::vector<float>{ x, y, z, w };
        Init();
    }

    float* operator[](int i) const
    {
        switch (i)
        {
        case 0: return x;
        case 1: return y;
        case 2: return z;
        case 3: return w;
        default: __debugbreak();
        }
    }

private:
    std::vector<float> data;

    void Init()
    {
        std::vector<float>::iterator start = data.begin();

        this->x = &(*++start);
        this->y = &(*++start);
        this->z = &(*++start);
        this->w = &(*start);
    }
};

有没有更高雅的方法来解决这个问题呢?

共有1个答案

谯嘉懿
2023-03-14

拥有单独的成员,然后使用switch语句是实现这一点的基本方法。不过,您不需要向量,可以像这样编写类

struct vec4
{
    float x = 0;
    float y = 0;
    float z = 0;
    float w = 0;

    vec4() = default;
    vec4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {}

    const float& operator[](int i) const
    {
        switch (i)
        {
        case 0: return x;
        case 1: return y;
        case 2: return z;
        case 3: return w;
        default: __debugbreak();
        }
    }
    
    float& operator[](int i)
    {
        // this is safe because we are in a non-const function, so this cant point to a const object
        return const_cast<float&>(static_cast<const vec4&>(*this)[i]);
    }
};
 类似资料:
  • Rust可以让我们对某些运算符进行重载,这其中大部分的重载都是对std::ops下的trait进行重载而实现的。 重载加法 我们现在来实现一个只支持加法的阉割版复数: use std::ops::Add; #[derive(Debug)] struct Complex { a: f64, b: f64, } impl Add for Complex { type Outpu

  • 我试图在Rust中实现C风格的表达式模板,使用特性和运算符重载。我试图重载每个表达式模板结构的'和'*'。编译器抱怨和特性实现: 如果我试图为其实现特征的类型在没有我的板条箱的情况下是可构造的,但该类型是必须实现我定义的特征的泛型,则该错误是有意义的。 代码如下: 想法?

  • 问题内容: 我知道golang不会提供运算符重载,因为它认为这会增加复杂性。 所以我想直接对结构实现。 https://play.golang.org/p/1U8omyF8-V 通过上面的代码, AddValue 可以按我的方式工作。但是,我唯一关心的是它是按值传递的,因此我每次必须返回新添加的值。 还有其他更好的方法,以避免返回汇总变量。 问题答案: 是的,使用指针接收器: 通过使用指针接收器,

  • 问题内容: 我已经使用JavaScript了几天,现在我想为定义的对象重载运算符。 在Google搜索了一段时间后,您似乎无法正式执行此操作,但是仍有一些人声称采取了一些漫长的方法来执行此操作。 基本上,我制作了Vector2类,并希望能够执行以下操作: 相反,我必须这样做: 我可以采用什么方法在Vector2类中重载运算符?因为这看起来很丑陋。 问题答案: 如您所见,JavaScript不支持运

  • 问题内容: 之间有什么区别 和 在TensorFlow中?用代替构造图形时,计算图形会有什么不同? 更一般而言, 张量或其他运算是否过载? 问题答案: 如果或中的至少一个是对象,则表达式和是等效的。您可能使用的主要原因是为创建的op指定一个显式的关键字参数,这对于重载的运算符版本是不可能的。 请注意,如果也不是(例如,如果它们是NumPy数组),那么将不会创建TensorFlow op。总是创建一

  • 主要内容:运算符重载的实现,可重载与不可重载的运算符C# 中支持运算符重载,所谓运算符重载就是我们可以使用自定义类型来重新定义 C# 中大多数运算符的功能。运算符重载需要通过 operator 关键字后跟运算符的形式来定义的,我们可以将被重新定义的运算符看作是具有特殊名称的函数,与其他函数一样,该函数也有返回值类型和参数列表,如下例所示: public static Box operator+ (Box b, Box c) {     Box bo