2017-04-25 78 views
0

我不知道C++ stl謂詞是如何實現的?例如在copy_if() http://www.cplusplus.com/reference/algorithm/copy_if/關於C++ stl謂詞的實現

根據Effective STL,謂詞按值傳遞。爲INT下面的代碼,

struct my_predicate{ 
    int var_1; 
    float var_2; 

    bool operator()(const int& arg){ 
     // some processing here 
    } 
} 

如何copy_if()實施關於向過往my_predicate的價值?這裏有var_1var_2。對於其他謂詞,結構中可能有不同的變量。

如果通過引用或指針傳遞,這對我來說非常合理。

非常感謝!

+0

請注意,大多數謂詞包含* no *變量。通過一無所有將是相當浪費。 –

+0

現在「首選」的方式是通過轉發參考。 – Jarod42

回答

1

(我希望我沒有誤解你的問題。)

爲什麼它可以按值傳遞的原因是「my_predicate」結構具有由編譯器自動生成一個隱含的拷貝構造函數。你可以通過值傳遞它,因爲它有一個拷貝構造函數。

實際上,編譯器很可能會優化拷貝。實際上,編譯器很可能會優化掉整個謂詞對象,例如在std :: copy_if的情況下,將代碼減少爲等效於for循環+ if語句。

按約定謂詞是按值傳遞的。即使整個謂詞沒有被優化,它們並不意味着成爲重量級的對象和小對象,但是無論如何,它的傳遞速度更快。

而且通常無法通過非const引用(更不用說指針),所以通過臨時值:

std::copy_if(begin(..),end(..),my_predicate{}); 

不會編譯爲您的謂語不是一個const函數。隨着價值傳遞,你可以逃避這一點。

+0

非常感謝!這是我正在尋找的答案! – SuperBald