C++ lambda閉包消除類成員變量的解決思路
一、背景
在面向?qū)ο缶幊虝r(shí),常常要添加類成員變量。
然而類成員一旦多了之后,也會帶來干擾。
拿到一個(gè)類,一看成員變量好幾十個(gè),就問你怕不怕?
二、解決思路
可以借助函數(shù)式編程思想,來消除一些不必要的類成員變量。
三、實(shí)例
舉個(gè)例子:
class ClassA{ public: ... int funcA() { m_valueA += 10; return m_valueA; } int funcB() { m_valueB += 100 return m_valueB; } private: int m_valueA = 0; int m_valueB = 0; };
上面的類中,m_valueA
僅僅被funcA()
使用,m_valueB
僅僅被funcB()
使用,如果這些變量作為類成員:
對于那些不需要使用它們的方法而言,是一種干擾;同時(shí),也會讓這些變量不那么可控,因?yàn)榭刂普邿o法保證其他方法不會修改它;
可以寫成:
class ClassA { public: ClassA() { { int valueA; m_funcA = [=] () mutable -> int { valueA += 10; return valueA; }; } { int valueB; m_funcB = [=] () mutable -> int { valueB += 100; return valueB; }; } } ... int funcA () { return m_funcA(); } int funcB () { return m_funcB(); } private: std::function<int()> m_funcA = nullptr; std::function<int()> m_funcB = nullptr; };
這樣,就把m_valueA
和m_valueB
消除了——通過將它們閉包到lambda表達(dá)式中,然后將這個(gè)lambda存起來重復(fù)使用。
需要注意的是
mutable
修飾符和=
值捕獲。如果用引用捕獲,棧變量會釋放導(dǎo)致非法訪存;如果不加mutable
就無法修改值捕獲的變量。
當(dāng)然,lambda的初始化時(shí)機(jī)也可以更改,例如放到使用時(shí),同時(shí)也做了判空更加健壯:
class ClassA { public: int funC () { printf ("hello world"); } int funcA () { if (!m_funcA) { int valueA; m_funcA = [=] () mutable -> int { valueA += 10; return valueA; }; } return m_funcA(); } int funcB () { if (!m_funcB) { int valueB; m_funcB = [=] () mutable -> int { valueB += 100; return valueB; }; } return m_funcB(); } private: std::function<int()> m_funcA = nullptr; std::function<int()> m_funcB = nullptr; };
到此這篇關(guān)于C++ lambda閉包消除類成員變量的解決思路的文章就介紹到這了,更多相關(guān)C++ lambda閉包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ auto自動(dòng)類型推導(dǎo)規(guī)則和使用詳解
C++11 賦予 auto 關(guān)鍵字新的含義,使用它來做自動(dòng)類型推導(dǎo)。也就是說,使用了 auto 關(guān)鍵字以后,編譯器會在編譯期間自動(dòng)推導(dǎo)出變量的類型,這樣我們就不用手動(dòng)指明變量的數(shù)據(jù)類型了2022-08-08C++構(gòu)造函數(shù)深度學(xué)習(xí)
這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造函數(shù),深度學(xué)習(xí)C++構(gòu)造函數(shù),感興趣的小伙伴們可以參考一下2016-08-08