問一個 C++ template 語法問題

看板C_and_CPP (C/C++)作者 (眠月)時間16年前 (2009/04/15 01:57), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
我現在有個 parsing tree 這樣,那 tree 就有 node 嘛, 因為我用的 yard parser,每一個 parsing rule 都是一個 class, 她的設計是有一個 abstract node,然後有 template node 去繼承 abstract node。 現在我想要加上 semantic action, 這樣的設計,這樣我可以透過 specialization 來特化每個 node<R> 的動作。 以圖來講就是這樣  ↙ node <expr> abs_node ← node <id> ↖ node <...> 以程式碼來說就是這樣 // Abstract Syntax Tree, 每一個 token 可能是很原始的 char, // 也可以是被 lex 處理過的 int, 所以是 class template template < typename T > struct ast { // abstract node struct abs_node { virtual void f () = 0 ; // semantic action, 純粹虛擬函數 } ; } ; // Abstract Syntax Tree, 每一個 token 可能是很原始的 char, // 也可以是被 lex 處理過的 int, 所以用 template template < typename T > struct ast { // abstract node struct abs_node { virtual void f () = 0 ; // semantic action } ; // 根據每個 parsing rule 繼承的 node template < R > struct node : abs_node { void f () { act<R> () ; } // 實作 f(), 呼叫特化的 act<R>() 函數 } ; } ; 那不過在這邊 act<R> 要被呼叫,當然在前面要先宣告嘛, template < typename R > void act () {} // generic 的版本,什麼都不做! // Abstract Syntax Tree template < typename T > struct ast { // abstract node struct abs_node { virtual void f () = 0 ; // semantic action } ; // 根據每個 parsing rule 繼承的 node template < R > // struct node : abs_node { void f () { act<R> () ; } // 呼叫特化的 act<R>() 函數 } ; } ; // 在這邊特化,就可以處理想要處理的東西。 template<> void act<expr> () { ... } template<> void act<id> () { ... } 但是,為了處理 node, act() 其實應該要接受 node 當作參數。 template < typename R > void act ( ... ) { } // 靠北這邊我不會宣告 XD // Abstract Syntax Tree template < typename T > struct ast { // abstract node struct abs_node { virtual void f () = 0 ; // semantic action } ; // 根據每個 parsing rule 繼承的 node template < R > // struct node : abs_node { // 為了要處理node, void f () { act<R> (this) ; } // 要把node自己傳進去! } ; } ; 對,問題就是這樣,我不知道那邊要怎麼宣告,哪個大師可以救我 QQ 或是不是設計成 function template, 設計成 class template 也可以,只要能符合這個設計就好 QQ 感恩。 -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.117.249 ※ 編輯: yoco315 來自: 118.160.117.249 (04/15 01:58) ※ 編輯: yoco315 來自: 118.160.117.249 (04/15 01:58) ※ 編輯: yoco315 來自: 118.160.117.249 (04/15 01:58)
文章代碼(AID): #19vCwPfc (C_and_CPP)
文章代碼(AID): #19vCwPfc (C_and_CPP)