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-08
C++構(gòu)造函數(shù)深度學(xué)習(xí)
這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造函數(shù),深度學(xué)習(xí)C++構(gòu)造函數(shù),感興趣的小伙伴們可以參考一下2016-08-08

