簡體   English   中英

為自定義向量類重載 operator[]

[英]overloading operator[] for a custom vector class

我正在創建一個類似於向量的類。 它使用自己的算法來確定數據的實際存儲位置和方式。 從用戶的角度來看,它就像一個法向量。

在內部,它試圖通過不多次存儲重復值來節省內存。 如果多次將相同的值推送到向量上,它會使用索引執行一些花哨的舞蹈動作,但只存儲一次實際值。

重載 operator[] 時,索引參數被轉換為“真實”索引,以便它可以訪問實際存儲數據的位置。

如果用戶嘗試像這樣訪問一個元素:

int i = svec[8];

通過將 8 轉換為“真實”索引並訪問正確的元素來返回正確的元素。

當用戶嘗試像這樣分配一個值時,問題就出現了:

svec[8] = 1;

值 8 將再次被“真實”索引覆蓋,並且對元素的引用由operator[]()返回。 但是,多個索引可能映射到該元素。 如果我返回一個引用並允許更改它,則會產生更改其他索引值的不良副作用。

如果我只是按值返回元素,您將無法使用 operator[] 分配值。

operator[]() ,我想知道某個操作是否計划更改元素的值,以便我可以創建一個新元素,使用索引做一些更花哨的舞蹈動作,並返回對新元素的引用。

這樣的事情有可能嗎? 如果沒有,似乎我被迫按值返回,從而阻止用戶使用 [] 修改值。

如果類有一個方法change_element並且每個人在更改時都調用此函數,那將很容易,不是嗎?

template <typename T>
struct my_vec {
  T& change_element(int index, T new_value)
  { ... }
};

現在,我們的想法是從為您完成這項工作的operator[]返回一個代理類。

  // inside my_vec:
  struct proxy {
    my_vec *vec;
    int index;

    T& operator=(T o)
    { return vec->change_element(index, std::move(o)); }

    operator T() const { return (*const_cast<my_vec const*>(vec))[index]; }
  };

  proxy operator[](int i) { return proxy{this, i}; }
  T const& operator[](int i) const { ... }

沒有開銷,每個常見的編譯器都應該優化代理元素。

這個技巧甚至被vector<bool>用在 STL 中。 查看這個以獲得更完整的示例。

您可以返回一個帶有類型轉換運算符的類和一個通知向量元素需要更改的賦值運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM