C 裡,如何在乙個類廠裡,用靜態方式判斷乙個類是否繼承自某個類??

時間 2021-05-31 15:09:42

1樓:dodoleon

直接用c++11的 std::is_base_of 就可以判斷是否是通過乙個基類繼承下來的。

2樓:Certain Y

template

size_t

m>constexpr

auto

string_equal

(const

char(&

value)[n

],const

char(&

o)[m])

for(

inti=0

;i

++i)}

return

true;}

constexpr

auto

find

(const

auto&)

constexpr

auto

find

(const

auto&t

,const

auto&f

,const

auto

&...r)

return

find(t

,r...);

}consteval

auto

new_finder

(const

auto

&...

css);}

#define register_class(X) # Xclass

factory

else}};

intmain

()編譯期最遠就到 is_db 了,除非把函式都改成 consteval;。因為字串放在引數列表裡不是常量("123" 和 "abc" 都是 const char[4]),所以不能分別例項化這兩個字串的過載,除非把他們寫在模板引數列表裡(會有很多逗號)。

3樓:XZiar

其實你是想要乙個傳入str,返回對應型別是否繼承於T的編譯期函式。

struct

T{};

structA:

public

T{};

struct

B{};

template

T>struct

Wrap

;template

F>constexpr

bool

Check

(std

::string_view

str,

Ffunc

)constexpr

bool

CheckT

(std

::string_view

str));}

intmain

()真正的難點在於……你的「註冊」行為很大概率沒法在編譯期完成,不手寫或者巨集寫if else的話,沒法在編譯期完成str->型別的重建……

而且想要編譯期檢查的話,你的str也得是編譯期可知的——那這和用enum其實也差不了多少了、

4樓:winston

你可以在傳參時,形參定義成const DBObject*

這樣就可以很大程度上保證傳進來的是資料庫物件,如果想再嚴謹一點,可以在基類實現乙個方法,string getClassType(),在函式體裡呼叫這個方法,將獲取到的字串比對一下即可。

拋磚引玉,看看有沒有人有更好的方法,相互學習~

5樓:hgjazhgj

如果傳入的const char *在編譯器都可確定,試試在isDbObject宣告中加上consteval,強制編譯器優化為編譯時計算

當然更好的方式是放棄用字串代表型別的做法,使用模板元程式設計

C 如何在編譯期檢測乙個類是否有成員函式?

霧雨口口子 include include using namespace std define GEN MEMBER FUNC CHECK CLASS func return type,func name,struct HasMemberFuncInspector func return type...

如何在乙個月內提高 C 水平?

saiyan 說句實話,如果只有乙個月,用C 做乙個資料處理的程式,然後刷LeetCode去吧。起碼可以掌握C 裡面常用的資料結構和語法了。 弓長禾口王 先看書,不要仔細看,大致了解,不拘細節即可,然後刷題,刷演算法題,自己敲!邊刷邊看,這時候就要注重細節的學習了。然後沒事的時候多關注C 類的部落格...

如何在乙個大學裡出名?

WadhgnBf432we3zz 我們學校有個qq表白牆,表白一般發在qq空間,加的人大概有四五百還是六七百,差不多是這個數吧。曾經有段時間,有乙個人被表白刷屏好幾天,吸引了一大波注意。如果你想的話,可以自創個表白牆推廣得夠好的時候瘋狂表白自己,哈哈 蘇嘉陌丶 其實我覺得在大學裡不出名是最好的,因為...