使用模版處理類成員函式呼叫及返回值處理

2021-10-11 04:25:54 字數 1161 閱讀 5406

前幾天同事在處理專案中,呼叫某個物件的成員函式,發現每次都要先獲取成員物件,然後在呼叫函式,這樣會有大量的重複**。

auto p =

getobject()

;if(p ~

=nullptr

)

我們把所有的獲取物件封裝到乙個模版函式裡面,但是有引入新的問題,因為有的函式有返回值,而且不同的函式返回值可能不一樣,還有一些函式的返回值是空。所以我們先要實現乙個獲取函式返回值的功能,然後對於不同的函式引數數量也不同,又要處理下多引數的問題。

// 萃取函式返回值

template

<

typenamet.

.. args>

struct

mytriat

;template

<

typename

rtype

,typename

ctype

,typename..

. t>

struct

mytriat

<

rtype

(ctype::*)

(t...)

>

// 類實現

class

ctesta

;int

funcb

(int x)

; ctesta*

funcc()

;};class

ctestb

public

:template

<

typename

call

,typename..

.t>

typename

mytrait

::_type callone

(int keya, call func, t&&..

.args)

else

}private

: unordered_map<

int, ctesta*

> m_mapa;};

// 呼叫

ctestb b;

b.callone(2

,&ctesta::funca,1,

2.0)

;

類成員函式呼叫

大家都知道c 的虛函式前必須加virtual,但如果一連串的繼承下來,有的忘了加virtual會出現什麼情況呢?為了滿足我的好奇心,做了點實驗然後有了本文,僅僅是好玩,沒有啥實際意義。本文只給出vs2005的情況 首先,如果是單一類,沒加virtual的話那麼好辦,直接call a fun,非sta...

模版類的成員函式定義問題

原因 模板是在使用的時候才就地生成 的。就是說如果沒有使用到該模板,模板的 根本不會被編譯。當你類似templatename這樣使用乙個模板的時候,編譯器才將int這個型別引入templatename這個模板的 從而生成所需要的class。你將模板實現分開,那麼編譯器在引入int型別到模板 的時候,...

類成員函式呼叫的細節

class concrete void printerror private int val void main 為什麼會出現這種情況呢?原來是,函式定義的時候,就一直存在了。即無聊是否 例項化了乙個物件,print 這個函式,都是存在的。所以 pc print 是可以找到函式的入口的。只是這時候,...