【问题标题】:Overload [] operator in C++ to support custom set function在 C++ 中重载 [] 运算符以支持自定义集合函数
【发布时间】:2019-01-01 08:12:20
【问题描述】:

我有一个模拟数组的 C++ 类,为了操作它的成员,我实现了两个函数:set(size_t index, size_t value) 和 get(size_t index)。我想重载 [] 运算符以具有以下功能:

MyCustomArray[index] = value //->set(size_t index, size_t value)

和

value = MyCustomArray[index] //->get(size_t index)

get 可以通过重载轻松实现,但我不知道如何实现set,因为我需要事先参数value。

我的类是一个固定字数组的实现(数组中的元素最多有 P 位,其中 P 是一个参数,它可以小于常规机器字)。为支持此功能,set 和get 操作常规 C/C++ 数组中值的位范围。

在这种情况下是否可能超载?

提前致谢!

【问题讨论】:

  • 从std::vector<bool> 中获取灵感并返回一个自身重载operator = 的临时代理对象。
  • @Quentin 应该有人慷慨地给它自己的名字,而不是让它成为 std::vector 破坏通用代码的疣,但它是所需功能的一个很好的例子。
  • @PeteBecker 最后一段中的小玩意似乎阻止了这个简单的解决方案。
  • @Deduplicator 唉!但是,是的,仅用于演示目的。
  • @Quentin -- 好点。我没有从头到尾读完。 :-( 已删除。

标签: c++ operator-overloading


【解决方案1】:

这就像 std::vector::operator[] 所做的一样——使用代理对象。

class MyCustomArray
{
public:
    using value_type = unsigned;
    class Proxy
    {
    public:
        friend class MyCustomArray;
        operator value_type() const 
        {
            return m_customArray.get(m_index);
        }
        Proxy & operator=(value_type value)
        {
            m_customArray.set(m_index, value);
            return *this;
        }
    private:
        Proxy(MyCustomArray & customArray, size_t index) 
            : m_customArray(customArray), m_index(index) {}
        MyCustomArray & m_customArray;
        size_t m_index;
    };
    value_type operator[](size_t index) const
    {
        return get(index);
    }
    Proxy operator[](size_t index) 
    {
        return Proxy(*this, index);
    }
    value_type get(size_t index) const;
    void set(size_t index, value_type value);
private:
    /// The data goes here
};

然后

void work(MyCustomArray & arr)
{
    // Return a Proxy object, and call operator= over it.
    arr[3] = 5;

    // arr_2 is of type MyCustomArray::Proxy
    auto arr_2 = arr[2];
    arr_2 = 1; // modifies arr[2]
    unsigned x = arr_2; // gets 1 from arr[2] 

    // This works, due to auto conversion to value_type:
    std::cout << arr_2 << '\n';
}

【讨论】:

  • 谢谢,我用过这个方法,效果很好!
【解决方案2】:

正如 cmets 中所述,这可以通过让 operator[] 返回一个代理对象来完成,这就是 std::vector&lt;bool&gt; 发挥其魔力的方式。

在你的情况下,它看起来像这样:

struct MyCustomArray;

struct ArrayMemberRef {
  MyCustomArray* target_;
  std::size_t index_;

  ArrayMemberRef& operator=(std::size_t value);
  operator std::size_t();
};

struct MyCustomArray {
  ArrayMemberRef operator[](std::size_t index) {
    return ArrayMemberRef{this, index}; 
  }

  void set(std::size_t index, std::size_t value);
  int get(std::size_t index);
};

ArrayMemberRef& ArrayMemberRef::operator=(std::size_t value) {
  target_->set(index_, value);
  return *this;
}

ArrayMemberRef::operator std::size_t() {
  return target_->get(index_);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2013-06-11
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多