怎麼在編譯期判斷乙個類是否存在指定函式名的函式?
#define has_member(member)\
template
struct has_member_##member\
; \
這個我們使用了`decltype`關鍵字,這個關鍵字具有型別推到的能力,但是它不執行其的表示式,那麼其就可以在編譯期做很多的事情,這裡就是使用它和編譯器會盡全力讓你的**時正確的特性來實現這個功能。
看第一句:
templatestatic auto check(int) -> decltype(std::declval().member(std::declval()...), std::true_type());
我們就是要檢視乙個類是否存在如這樣的表示式class.member(...)
。那麼這裡,在decltype內部的逗號運算表示式,,如果存在這樣的形式,那麼就可以匹配逗號表示式的第乙個std::declval().member(std::declval()...)
,說明存在這樣的函式,又由於逗號表示式返回的時最後逗號的右邊的值,實際decltype推導的型別是std::true_type型別,應為decltype只能根表示式,所以我們例項化乙個std::true_type的物件,用其的建構函式作為表示式,那麼如果存在指定函式名的表達時,這check(int)函式的返回值型別就為std::true_type。
那麼如果在逗號表示式的時候,第乙個表示式不匹配怎麼辦,其實就是不存在,那麼我們該怎麼表明?我們要利用編譯器它會希望你通過編譯的特點來進行。
templatestatic std::false_type check(...);
當上面的check函式匹配不能滿足時,那麼就是不存在指定函式名的函式,其會匹配這個check函式,那麼其的返回值型別就是std::false_type,那麼我們就可以通過檢測推導出的check返回值型別來確定是否包含這個指定函式名的函式。
static const bool value = std:
:is_same(check
(0)), std:
:true_type>
::value;
has_member(a)
has_member(c)
struct a
void b() {}
void c(int, bool) {}
};int main()
判斷乙個類是否存在
我們在開發的過程中難免會用到低版本中沒有的類,如果我們想讓我們的應用盡可能的相容多個版本,我們需要考慮 如果我們使用的類在低版本中沒有怎麼辦呢。class pkclass nsclassfromstring pkaddpassesviewcontroller if pkclass else nsst...
判斷乙個類是否存在
我們在開發的過程中難免會用到低版本中沒有的類,如果我們想讓我們的應用盡可能的相容多個版本,我們需要考慮 如果我們使用的類在低版本中沒有怎麼辦呢。class pkclass nsclassfromstring pkaddpassesviewcontroller if pkclass else nsst...
保證乙個類只有乙個例項存在
需求 在做一些彈出視窗的時候,往往需要在新的彈出視窗被建立出來之前,要檢查是否已經有視窗存在。如果存在,則先移除已經存在的例項,然後再建立新的例項。這樣就保證了乙個類只有乙個例項存在。思路 主要就是在類中設定乙個指向自身的靜態屬性。package private function show void...