怎麼才能輸出 functor 內的成員變數

時間 2021-05-31 08:25:34

1樓:Colliot

樓上說得對,std::for_each 的最後乙個引數是傳值的,你這個 FindMax 每次都被構造了一次。解決方案也很簡單,手動修改 for_each 的模板引數就行……

把for_each

(elems

,elems

+ArraySize,fm

);修改成

for_each

(elems

),decltype(fm

)&>(elems

,elems

+ArraySize,fm

);手動新增乙個引用就行。

但這個如果 for_each 內部對 fm 做了某些操作,比如 move 之後,可能就失效了。乙個更好的方法是把 max 做成引用,這樣不管它是 copy 還是 move,都會指向原來那個值。當然這個時候就不能用 INT_MAX 初始化了,它就一字面量。

應該開闢乙個 int int_max = INT_MAX;

其實為了貫徹 functor 思想,還可以再套一層閉包(其實 functor 就是閉包嘛,只不過有個直接呼叫的語法糖)就行了——搞乙個 GenFindMax,把 max 的實際值儲存在 GenFindMax 裡面,GenFindMax 每次呼叫生成乙個 FindMax,其中存了乙個對 GenFindMax 裡 max 的引用。不過這麼搞意義不明……具體寫法如下:

#include

#include

#include

#include

using

namespace

std;

#define ArraySize 1024

struct

FindMax

void

operator

()(intx)

}};struct

GenFindMax

FindMax

operator

()()

};int

main

()GenFindMaxfm=

GenFindMax

(INT_MIN

);for_each

(elems

,elems

+ArraySize,fm

());

cout

<

max<<

endl

;return0;

}執行% g++ -o closure closure.cpp && ./closure

1997

說起來感覺算這個值的期望很有意思……

2樓:573xmcgcg

因為 for_each 的第三個引數的並不是【函式物件的引用】,也就是說 for_each 只是在操作【fm的副本】而已,實際上並沒有改變 fm 本身的狀態。你需要做的就是在 for_each 那一句開頭加上【fm=】,這樣副本被更改後的狀態就可以儲存到 fm 上。

怎麼才能把雙眼皮變成內雙?

QING 我當初是非常單的內雙,後來是用雙眼皮貼成大內雙,稍微明顯的內雙,定了型很開心!但很煩人就是哭過後一晚上後眼皮變得很奇怪的形狀。如果你是內雙,眼皮不太腫的話,你可以嘗試晚上貼雙眼皮睡覺,怕眼皮鬆弛可以軟化雙眼皮貼再撕下來,然後多按摩眼皮。 整形知多少 不用力掙,可以理解為正常睜眼閉眼狀態下,...

怎麼樣才能使斯內普教授喜歡自己?

claris 斯內普教授因為對莉莉的愛而昇華不朽,如果他愛上莉莉後又愛上了別人,就不是他了。所以最好的辦法是在接觸莉莉之前遇到他,給他光,然後一起在斯萊特林陪伴他。 Jentree 之前回答過類似問題,這個就直接搬過來啦 最好是給過斯內普溫暖又很優秀來等斯內普追。當然,如果以上不成立非要追的話。那麼...

怎樣才能使 LED 輸出的圓形非均勻光變為矩形均勻光?

看你對均勻度的要求和亮度的要求。在均勻度和亮度要求不高的情況下,用背光源就可以了。要是對均勻度要求高,亮度要求高,只能是加多層光學透鏡,先得到圓形的高均勻度光斑,然後用乙個方型孔的遮光片來得到方型高均勻度光斑,亮度倒好說,加功率就行。我桌子上剛好就有乙個,JC叔叔勘測現場是掃指紋和血跡用的,裡邊4層...