簡體   English   中英

包含在智能指針中的類的運算符重載

[英]Operator overload of class wrapped in smart pointers

我一直在嘗試在一個包含在智能指針中的類上進行一些運算符重載(*和+)。

auto p = std::make_unique<Polynomial<T>>();

當我嘗試使用正常重載來重載它時,它顯然要求智能指針類型。

編輯,所以:

std::unique_ptr<Polynomial<T>> operator+(const std::unique_ptr<Polynomial<T>>& right);

template<class T>std::unique_ptr<Polynomial<T>> Polynomial<T>::operator+(const std::unique_ptr<Polynomial<T>>& right) {
    //Do stuff
}

而錯誤:

嘗試使用+運算符時出錯

那么當類封裝在smartpointer中時,如何重載正常運算符呢?

別。

在指針上運行這些操作,而不是在指針上:

*p = *p + *p

如果突然指針具有完全不同且意外的語義,那么對於代碼的用戶來說會非常混亂。

這對你來說也很困惑。

為了直接回答你的問題,我同意@LightnessRacesinOrbit: 不要 但是寫另一個答案的原因是你問的問題對我來說聽起來有點像XY問題

你有一個Polynomial<T>類,但你希望用戶將它包裝在智能指針中? 這很可疑,因為理智的設計只是希望用戶直接使用Polynomial ,從而提供直接在該類型上工作的普通操作員。

退后一步,想一想為什么你認為智能指針會被使用/需要/有幫助。 通常,這是出於效率假設的原因而做的,對吧? 但這只是意味着你應該重新思考如何實現Polynomial本身。 請看以下內容:

  • Polynomial是否具有移動構造函數和分配? 如果沒有,請實施它。
  • 存儲的數據怎么樣? 也許內部存儲應該由智能指針管理。 與移動語義一起,這可以導致非常有效的操作。
  • 對於運算符重載,執行a+=b; ,使用庫為您生成a+b 檢查Boost.Operators或我的df.operators ,后者也是移動感知的。

使用正確的實現,使用std::unique_ptr<Polynomial<T>>的沖動應該消失:)

那么當類封裝在smartpointer中時,如何重載正常運算符呢?

只需像平常一樣聲明它們:

template<typename T>
Polynomial<T> operator*(Polynomial<T> lhs, Polynomial<T> rhs) { ... }

template<typename T>
Polynomial<T> operator+(Polynomial<T> lhs, Polynomial<T> rhs) { ... }

然后給出類似的東西:

auto p = std::make_unique<Polynomial<int>>();
auto q = std::make_unique<Polynomial<int>>();

只需致電:

auto x = (*p) * (*q);
auto y = (*q) + (*p);

現場演示


您提供的錯誤:

在此輸入圖像描述

是由於您的運營商超載的事實:

std::unique_ptr<Polynomial<T>> operator+(const std::unique_ptr<Polynomial<T>>& right);

正在重載一元運算 operator+表達式+x

和另外一個:

template<class T>
std::unique_ptr<Polynomial<T>> Polynomial<T>::operator+(const std::unique_ptr<Polynomial<T>>& right) {
    //Do stuff
}

重載operator+Polynomial<T>std::unique_ptr<Polynomial<T>>類型的操作數。

因此給定兩個unique_ptr<Polynomial<T>> ,即xy ,表達式如下:

x + y

找不到operator+的重載決策。

我也強烈反對標准庫類型的運算符重載。

暫無
暫無

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

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