重载间接运算符以匹配下标运算符?

问题描述 投票:0回答:1

我正在尝试编写一个行为类似于 std::set 的类 - 因为元素都是唯一的,并且添加集合中已有的元素不会执行任何操作 - 但是,集合中的元素位于像 std::vector 一样的自定义顺序,而不是像 std::unordered_set 一样按数字/字母顺序排序或完全未排序。

我完成此操作的方法是在我的类中同时使用 std::vector 和 std::map 。实际上我已经按照我想要的方式工作了,现在我只是想弄清楚如何添加一些重载以更方便地访问元素。

这是我迄今为止所拥有的一个最小示例,精简为与问题相关的部分:

template <typename ValueType, typename Comparer = std::less<ValueType>> class MappedVector {
    public:
    using VECTOR = std::vector<ValueType>;

    private:
    VECTOR _vector = {};

    public:
    VECTOR get() const {
        return _vector;
    }

    ValueType operator[](ptrdiff_t index) const {
        return get()[index];
    }
};

get方法允许访问底层std::vector,下标运算符允许访问元素。我不希望其他代码直接访问 std::vector,因为直接向其中添加元素会导致它与我用来索引它的 std::map 不同步,因此使用

VECTOR
代替
VECTOR&
ValueType
代替
ValueType&
是故意的:我想从这些返回副本,并需要通过我的
push
pop
方法或赋值运算符来修改元素。

无论如何,这一切都很好。问题在于间接运算符。通常对于向量,以下两行代码是等效的:

std::string element = vec[1];
element = *(vec + 1);

我已经实现了前者,但我不知道需要使用什么重载来获得后者。编译如下:

ValueType operator*() const {
    return get()[0];
}

但这只允许访问第一个元素。因此,我无法向指针添加一个来获取另一个元素,如上面的代码示例所示。如果我用我认为正确的内容替换它:

ValueType operator*() const {
    return *get();
}

现在我得到这个编译错误:

错误 C2676 二进制“+”:“MAPPED_VECTOR”未定义此运算符 或转换为预定义运算符可接受的类型

我相信我需要重载 ++ 和 -- 的运算符才能使其工作,但是我到底如何转发这些运算符,以便它们在向量上运行,而不是在

this
对象本身上运行?我不想在我的类中的向量上实际执行某种版本的
_vector++
,因为这将影响所有未来的访问,而不仅仅是当前的访问。但据我了解,间接运算符是在之后发生的,所以我是否需要以某种方式存储加法/减法的结果?

c++ vector operator-overloading
1个回答
0
投票

在您的类上执行的操作是加法运算符,如错误消息所示。 IE。表达方式主要是

vec + 1
.

因此您需要一个

operator+
函数,它接受
size_t
参数并返回指向所需元素的指针:

ValueType const* operator+(size_t index) const
{
    return &_vector[index];
}
© www.soinside.com 2019 - 2024. All rights reserved.