C 語言中的元類程式設計(五)

2021-06-21 02:57:18 字數 2218 閱讀 9713

在上一節中,我們得到了meta_worker的第乙個版本,但是那個版本還不能使用,因為它只有對worker類的描述資訊(除regcutpoint外),我們還需要為它新增一些方法去操作它的物件(注意,它的物件不是worker類的物件,而是worker類本身) ,那麼我們需要為它新增一些什麼方法呢?我們知道,每個c++的類都有構造和析構函式,當我們建立和釋放乙個物件時,它會自動被呼叫,而這些都是編譯器幫我們完成的(即生成相應的指令**),另外,當呼叫乙個函式時,我們不用去寫引數入棧出棧以及跳轉的操作,這些也都由編譯器為我們自動完成。類似的,對於元類來說,它也需要提供以下三個操作:構造目標類的物件,析構目標類的物件,以及執行乙個目標類的函式呼叫。(至此,我們應該可以對元類有乙個更深刻的理解了,實際上你可以把它理解為乙個「類」的直譯器。)

為節省篇幅,這裡將直接給出上面三個操作的實現,而忽略其宣告:

meta_worker::object_data * meta_worker::newobject(const char * name)

void meta_worker::deleteobject(object_data * objdata)

template<>

struct arg_detector: meta_worker::meta_method_args_base

template

struct ret_detector

template<>

struct ret_detector

}; template

struct meta_worker_method_invoker

};以上三個函式實現均沒有考慮切入點的問題,在增加對切入點的支援之前,我們有必要先來討論一下這三個函式的實現。前兩個函式比較簡單,也較容易理解,而第三個函式(即執行乙個目標類的函式呼叫)邏輯上並不是很難理解(需結合之前介紹過的模板特化知識),需要討論的是這個函式的用法。讓我們不妨來寫一段使用這個函式呼叫sayhello的例子:

meta_worker metaworker;

meta_worker::object_data * objdata = metaworker.newobject("jim");

meta_closure ** metamethodtable = metaworker.methodtable();

void_type arg, ret;

meta_worker_method_invoker::invoke(metamethodtable[1], objdata, arg, ret); // 如果不加注釋,從這個呼叫我們完全無法知道它要幹什麼,而且如果不看 「sayhello」的實現,那個arg和ret的型別為什麼是void_type也讓人困惑

metaworker.deleteobject(objdata);

從上面的例子不難看出,如果我們直接使用meta_worker_method_invoker去呼叫乙個函式,它的**可讀性非常的差,極其不利於理解(這個例子提醒我們,我們在設計程式或實現乙個函式的時候,不能只滿足於邏輯的正確性)。那麼有沒有什麼改進的方法呢?有的,方法就是使用閉包。回顧一下閉包的概念,閉包是將乙個函式的入口和呼叫這個函式所需要的引數封裝在一起的資料結構,那麼我們可以考慮先從meta_worker中返回乙個sayhello函式的閉包,然後再去呼叫它,見下面的**:

struct say_hello_closure // 注意我們利用過載 operator () 來讓呼叫**更易讀

};bool meta_worker::getmethod(const char * name, void * out_closure, size_t closuresize) else

return false;

}//下面是用法示例:

meta_worker metaworker;

meta_worker::object_data * jim = metaworker.newobject("jim");

say_hello_closure sayhello;

metaworker.getmethod( "sayhello", &sayhello, sizeof(sayhello) );

sayhello(jim);

metaworker.deleteobject(jim);

這個版本是不是看上去就好多了呢?需要指出的是,上面的三個函式都只是針對meta_worker的實現,實際上我們可以只利用runtime_class介面和模板來實現一組通用的操作,有興趣的朋友可以自己試一試,這裡就不再展開討論了。



C語言中的類模擬(C 程式設計思想)

在物件導向 1 例項 下面先從乙個小例子看起 ifndef c class define c class struct endif c class a c class b void b f2 c class b bthis void a foo c class a athis void b foo ...

C語言中的物件導向 C語言中的類模擬

在物件導向的語言裡面,出現了類的概念。這是程式設計思想的一種進化。所謂類 是對特定資料的特定操作的集合體。所以說類包含了兩個範疇 資料和操作。而c語言中的struct僅僅是資料的集合。li 1978 163.com 1 例項 下面先從乙個小例子看起 ifndef c class define c c...

c語言中的程式設計經歷

一 編寫 列印斐波那契數列的程式 1,演算法的分析 初步判定該過程用迴圈結構,a1 1 a2 1 a3 a2 a1 a4 a3 a2 顯然在c語言中這樣寫無法執行,這樣我就想到了用賦值法 因為宣告變數是有限的 a1 a1 1 a2 a2 1 a3 a1 a2 a1 a4 a2 a2 a1 a5 a1...