推 LPH66:話說 VS2005 有引進了 _countof 可以用 09/12 12:52
→ LPH66:那個東西我沒記錯的話會求出一個 compile-time constant 09/12 12:53
→ LPH66:你用那玩意試試看 09/12 12:53
→ LPH66:_countof 的寫法和你一開始那個 sizeof_array 很像 09/12 12:54
→ LPH66:只是它繞了一圈不呼叫它而用 sizeof() 去求出所要的值出來 09/12 12:54
→ loveme00835:謝謝 L 大提供的, 其實我剛開始實作的時候也是用參數 09/12 13:28
→ loveme00835:匹配 + 檢驗回傳值大小來做, 不過程式碼太長又不好懂 09/12 13:28
→ loveme00835:最後就變成這樣囉~ > < 09/12 13:28
※ 編輯: loveme00835 來自: 114.45.64.97 (09/12 13:50)
推 nowar100:推研究心得 09/12 14:05
推 yoco315:太深奧了看不懂 qq 09/12 15:24
→ loveme00835:請問 y 大, 小弟有哪些地方打不夠詳盡嗎@_@? 09/12 17:59
推 softwind:看不太懂目的 是因為VLA所以compiler-timr抓不到個數嗎? 09/13 00:00
→ loveme00835:是阿~ 因為VLA的關係, 沒辦法傳陣列參考給函式(模版) 09/13 00:14
※ 編輯: loveme00835 來自: 140.121.197.115 (09/13 00:19)
→ xatier:VLA 不是C99的東西嗎? C++有支持那玩意@@? 09/13 07:11
→ wawi:一開始說的問題能理解 但大大你說的解決方法還真看不懂@@ 09/13 09:54
推 LPH66:和我說的解法的想法是一樣的 都是需要一個編譯時期常數 09/13 10:59
→ LPH66:這裡原 PO 是利用 enum 配上 template 來達成而已 09/13 10:59
→ LPH66:不過我還滿欣賞 _countof 的解法就是了 XD 09/13 11:00
→ loveme00835:_countof 那招比較酷啦! XD 09/13 17:20
推 tomap41017:有點疑問是template argument不應該是compile-time 09/13 20:54
→ tomap41017:就要得知的嗎?那ARRAY_SIZE應該是compile-time constan 09/13 20:54
→ tomap41017:不是嗎??請問小弟想法哪裡有誤@@" 09/13 20:54
int a[ 10 ];
cout << sizeof_array( a ) << endl; // 使用第一版本
編譯器看到這樣的code會由模版產生類似下面的函式實體出來
size_t sizeof_array( int (&)[ 10 ] )
{
return 10;
}
雖然數值可以在編譯時期被得知, 但是在使用的時候必須要先呼叫
函式才能拿回這個常數, 要到執行時才能知道陣列大小.
※ 編輯: loveme00835 來自: 140.121.197.115 (09/13 21:18)
推 tomap41017:我也是像大大回文想的那樣,但編譯器不會把它inline 09/13 21:45
→ tomap41017:化嗎?這樣就變成了編譯期常數@@"?還是有什麼我沒注意 09/13 21:46
→ tomap41017:注意到.......感謝大大 09/13 21:46
→ loveme00835:gcc下-O3 和 VS2010下/Ox也是不會inline說> <我是不 09/13 23:19
→ loveme00835:知道編譯器什麼時候會決定幫你展開, 不過不同的編譯器 09/13 23:20
→ loveme00835:策略不一樣的話也會讓人理不清頭緒的! 所以如果真的需 09/13 23:21
→ loveme00835:要 inlining 一個函式, 必須知道編譯器「真的」會這 09/13 23:21
→ loveme00835:樣做, 不然就用「一定」會在編譯時期評估值的寫法, 而 09/13 23:22
→ loveme00835:不要用猜的 09/13 23:22
推 tomap41017:推 感謝大大 09/14 00:40