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