[問題] 樣版設計 - 只接受特定幾種類別該怎設計?

看板C_and_CPP (C/C++)作者 (雲淡風輕)時間16年前 (2009/05/19 23:54), 編輯推噓11(11036)
留言47則, 9人參與, 最新討論串1/3 (看更多)
今天我遇到一個樣版設計的問題~ 問看看大家有沒有啥好想法? 問題是這樣的~ 我今天需要設計一個類別來計算數學問題(矩陣運算) 當我寫 template< class T > void add(T** a,T** b,int X, int Y); { //matrix adding; } 但問題來了~ T 可以是int float double 但是char就應該不要吧~ 那這樣要怎解決 且要是我想讓 vector< vector< T > >,list< list< T > >......等stl容器放入 那我該如何寫? 總不會是一種寫一個吧~ 那這樣就會失去template的意義的說~ 我是有想過要typeinfo去處理~ 不過應該還有其他更聰明的方式處理~ 有沒有那位大師有經驗的~ 可以分享一下嘛? 感謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.12.55

05/20 00:02, , 1F
char 為什麼不行???
05/20 00:02, 1F

05/20 00:03, , 2F
個人認為這樣失去了你用template的意義
05/20 00:03, 2F

05/20 00:03, , 3F
char a = 10; a = a*a; ???
05/20 00:03, 3F

05/20 00:04, , 4F
為char寫個特化版本 裡面的constract放個assert(false)?
05/20 00:04, 4F

05/20 00:08, , 5F
這樣編譯期還是會過....
05/20 00:08, 5F

05/20 00:08, , 6F
我想問為什麼 char 不能
05/20 00:08, 6F

05/20 00:10, , 7F
char特化裡面放個 int a[0] 編譯就不會過了
05/20 00:10, 7F

05/20 00:10, , 8F
不過我還是要問為什麼 char 不行..
05/20 00:10, 8F

05/20 00:15, , 9F
我的話是根本不去定義特化版本 ... 反正 linker 必錯
05/20 00:15, 9F

05/20 00:17, , 10F
矩陣裡面會計算字元? 雖說字元丟進去可以視為size_t啦
05/20 00:17, 10F

05/20 00:18, , 11F
可是我就比較想就只處理double float int這樣~
05/20 00:18, 11F

05/20 00:19, , 12F
leg大~ 那這樣你是說要為每種型態都寫一個function?
05/20 00:19, 12F

05/20 00:20, , 13F
但是裡面的code基本上都是重覆的耶~ XD
05/20 00:20, 13F

05/20 00:20, , 14F
std::basic_string也沒有限定只能用char和wchar_t啊
05/20 00:20, 14F

05/20 00:21, , 15F
為什麼 link 必錯 @@?
05/20 00:21, 15F

05/20 00:21, , 16F
你如果要限定只有某幾個型別可用template
05/20 00:21, 16F

05/20 00:22, , 17F
你不會只想處理 double float int 的,相信我..
05/20 00:22, 17F

05/20 00:22, , 18F
就是特化double float int,然後通用版本不寫定義
05/20 00:22, 18F

05/20 00:22, , 19F
問題是這樣你寫 template 幹麻?= =
05/20 00:22, 19F

05/20 00:23, , 20F
有一天你會想塞 fractal, BigNum 等等東西..
05/20 00:23, 20F

05/20 00:23, , 21F
而且做為一個泛化的概念,只要有實作運算語意的都應
05/20 00:23, 21F

05/20 00:23, , 22F
到最後的結果就是你會發現這才是泛型的本質..
05/20 00:23, 22F

05/20 00:23, , 23F
該可以塞進你寫的template
05/20 00:23, 23F

05/20 00:24, , 24F
y大跟我玩內插法....QQ
05/20 00:24, 24F

05/20 00:24, , 25F
可是我想接stl的東西呀~ 所以這樣加一加也不少~
05/20 00:24, 25F

05/20 00:24, , 26F
l大也插我 >///<
05/20 00:24, 26F

05/20 00:25, , 27F
你們一定要這樣插來插去的嗎...(大誤)
05/20 00:25, 27F

05/20 00:27, , 28F
你要接 stl 跟你要擋掉 char 有什麼關係?不懂..
05/20 00:27, 28F

05/20 00:31, , 29F
我說的讓linker錯誤是像這種定義:
05/20 00:31, 29F

05/20 00:32, , 30F
template<typename T>T add(T); 具現化後linker會錯
05/20 00:32, 30F

05/20 00:32, , 31F
但是如果不具現化就沒事
05/20 00:32, 31F

05/20 00:35, , 32F
y大~ 你有看過矩陣內都是字元的數值運算嘛?
05/20 00:35, 32F

05/20 00:36, , 33F
你也可以看成是1byte的數字吧...
05/20 00:36, 33F

05/20 00:37, , 34F
char a[][]={{a,b,c},{!,$,@},{R,S,T}}; <=很怪吧~
05/20 00:37, 34F

05/20 00:37, , 35F
unsigned short 還會被某個平台cast成wchar_t咧
05/20 00:37, 35F

05/20 00:43, , 36F
我沒把他看成字元,我把他看成 8bit 的整數..
05/20 00:43, 36F

05/20 00:44, , 37F
沒道理我一個泛型函數處理 32bit 卻不處理 8bit O_O
05/20 00:44, 37F

05/20 00:48, , 38F
也是啦~ 只是我想說不要讓使用者做出這樣的錯誤~ 因為
05/20 00:48, 38F

05/20 00:49, , 39F
計算出來的東西可能對他來說是個廢物~ XD
05/20 00:49, 39F

05/20 01:00, , 40F
個人覺得char就當作8 bits整數看待就好, 要這樣用是AP的
05/20 01:00, 40F

05/20 01:01, , 41F
問題, 使用者要寫出個老暴表的也是使用者的事情....
05/20 01:01, 41F

05/20 01:02, , 42F
再說還有short呢?? int64之類的呢....XD
05/20 01:02, 42F

05/20 02:04, , 43F
考慮 char 會爆表, 怎麼不擔心 int 或 int64 其實也會? XD
05/20 02:04, 43F

05/20 02:04, , 44F
相乘相加的動作明明都是一樣的 XD
05/20 02:04, 44F

05/20 02:05, , 45F
char 只是 "大小剛好" 很方便拿來當 ascii character
05/20 02:05, 45F

05/20 02:06, , 46F
如果擔心誤用, 那 wchar_t (short) 大小的也要拿出來看了
05/20 02:06, 46F

05/20 10:05, , 47F
我也都寫完就不理了, operator 沒實作的自然會錯
05/20 10:05, 47F
文章代碼(AID): #1A4jP8v4 (C_and_CPP)
文章代碼(AID): #1A4jP8v4 (C_and_CPP)