或許,從代碼結(jié)構(gòu)的角度來講,你第一個想到的是把callee從caller中拿出來,放到某個合適的地方做初始化,這是個不錯的方法,但相信我,在有些時候這并不是個有效的辦法:你可能無法找個那個“合適的地方”,你也可能找到了但因此而失去lazy initialization的好處~~~。
這里,我只想對這個問題找個好點(diǎn)的方法。
第一個方法很簡單,就是用個靜態(tài)的flag來判斷:
static bool flag = false;
if(!flag)
{
callee();
flag = true;
}
這個可以非常完美的工作,但是看起來代碼多了點(diǎn),而且每個后續(xù)調(diào)用都要有個取反和判斷操作,這對調(diào)用頻繁的操作的性能是有影響的。另外,即使影響不大,從程序員感受的角度來看,你也不希望有多余的判斷~~~
哦,取反可以去掉:
static bool flag = true;
if(flag)
{
callee();
flag = false;
}
但是,判斷還是存在。
當(dāng)然,我們還有第二種更簡潔的方法,假設(shè)callee的返回類型時int:
static int dummy = callee(); // 1)
完了,利用靜態(tài)變量只初始化一次的特點(diǎn)就可以實現(xiàn),簡潔,而且高效。
但是,這里有個問題:如果callee的返回類型時void,那怎么辦?你不能:
static void dummy = callee();
static int dummy = (int)callee();
static int dummy = reinterpret_cast<int>(callee());
因為void其實不是個類型,而是沒有類型。
即使你覺得自己很聰明,想出了下面這種方式:
bool dummyfunc(void){return true;}
static bool dummy = dummyfunc(callee());
那也是不靈光的,不要以為callee返回void,把返回的void傳給dummyfunc的參數(shù)就可以了,因為void根本就不是個類型,根本沒有賦值,傳值這個概念~~~
幸虧C++中還有個叫逗號表達(dá)式的東西,說實話,C++用了7年多,這是我第一次發(fā)現(xiàn)逗號表達(dá)式這么可愛:
逗號表達(dá)式會這個計算每個子表達(dá)式,并返回最后一個子表達(dá)式的值
于是,就有了這個解決方案:
static bool dummy = (callee(), true); // 2)
也是同樣的簡潔、高效。
看來,直接用靜態(tài)變量初始化的方法是可以達(dá)到這個目的,而且會更好。
附:
我相信還會有其他方法來處理callee返回void的情況的,如果你知道,請不吝賜教!