C 怎麼判斷乙個類存在指定的函式名的函式

2021-07-04 08:30:12 字數 1289 閱讀 3108

怎麼在編譯期判斷乙個類是否存在指定函式名的函式?

#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...