[問題] Template + pimpl ?

看板C_and_CPP (C/C++)作者 (CA)時間15年前 (2011/05/01 00:39), 編輯推噓1(1018)
留言19則, 3人參與, 最新討論串1/1
最近需要實作一些泛型演算法,介面長得像這樣: template< typename T > class Algo { public: static void call( /* ... */ ) { // large part } private: Algo() { // blah blah } }; 總之裡面可能會出現很多實作細節才會用到的東西 像是 inner class 之類的 但礙於 template 沒辦法分開編譯,想藏也不知從何藏起 ... 不知各位有無好辦法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 175.96.117.192

05/01 00:47, , 1F
使用置入式模型(Inclusion model)
05/01 00:47, 1F

05/01 01:01, , 2F
目前我找到的兩個方法,一個是 export (顯然不可行)
05/01 01:01, 2F

05/01 01:01, , 3F
另一個是手動具現化 ... 但這方法也不好啊 orz
05/01 01:01, 3F

05/01 01:03, , 4F
把實作寫到別的 .h 檔, 然後在 Algo 規格中間引入該
05/01 01:03, 4F

05/01 01:03, , 5F
實作檔
05/01 01:03, 5F

05/01 01:07, , 6F
可是 client include 時還是會全部展開吧?
05/01 01:07, 6F

05/01 01:10, , 7F
隱藏實作的目的本來就是"你不需要知道"而不是"你絕不
05/01 01:10, 7F

05/01 01:10, , 8F
能知道"阿 XD
05/01 01:10, 8F

05/01 01:22, , 9F
這樣跟直接寫在 header 裡沒什麼不同吧
05/01 01:22, 9F

05/01 01:23, , 10F
pimpl 包裝過後的東西的確是"你絕不會知道"
05/01 01:23, 10F

05/01 01:23, , 11F
嗯 ... 我後來想想,linker 那一關實在太難過了
05/01 01:23, 11F

05/01 01:26, , 12F
pimpl 包裝起來的目的是"你不需要知道", 因為一但你知
05/01 01:26, 12F

05/01 01:27, , 13F
到的太多, 會讓相依性變大, 實作端反而沒有多大的修改
05/01 01:27, 13F

05/01 01:28, , 14F
空間. 跟直接寫沒什麼不同, 但 export 你也不能用了
05/01 01:28, 14F

06/02 17:55, , 15F
大部份的template library都會有detail這個資料夾..
06/02 17:55, 15F

06/02 17:55, , 16F
裡面放的就是實作 像那種純header的library根本就無法不
06/02 17:55, 16F

06/02 17:56, , 17F
讓使用者知道實作啊XD 隱藏實作是為了簡化閱讀
06/02 17:56, 17F

06/02 17:56, , 18F
不是為了不讓使用者惡搞你
06/02 17:56, 18F

06/02 17:56, , 19F
糟糕,我覺得我上面的文法好奇怪XD
06/02 17:56, 19F
文章代碼(AID): #1Dl3icH2 (C_and_CPP)
文章代碼(AID): #1Dl3icH2 (C_and_CPP)