作者StubbornLin (Victor)
看板C_and_CPP
標題Re: [問題]C++ 九九乘法表 如何用if來寫呢??
時間Tue Feb 2 15:19:05 2010
手癢
meta-prpgramming版本
老實說我不知道那個inline到底最佳化會不會成功
如果會的話應該都會完全被展開來
相當於全部寫成cout形式
如果沒有其實就是遞迴的形式
這是我亂寫的 有錯別打我= =
--------------------------------------
#include <iostream>
using namespace std;
inline void printLine(int i, int j) {
cout << i << " * " << j << " = " << i * j << endl;
}
template <int I, int J>
struct Line {
inline static void print() {
printLine(I, J);
Line<I, J+1>::print();
}
};
template <int I>
struct Line<I, 9> {
inline static void print() {
printLine(I, 9);
}
};
template <int N>
struct Group {
inline static void print() {
Line<N, 1>::print();
cout << endl;
Group<N + 1>::print();
}
};
template <>
struct Group<9> {
inline static void print() {
Line<9, 1>::print();
}
};
int main() {
Group<1>::print();
return 0;
}
=============================
我改寫了一下= =
推廣成可以變成任意N*N的乘法表
新的版本
#include <iostream>
using namespace std;
inline void printLine(int i, int j) {
cout << i << " * " << j << " = " << i * j << endl;
}
template <int I, int J>
struct Line {
inline static void print() {
Line<I, J-1>::print();
printLine(I, J);
}
};
template <int I>
struct Line<I, 1> {
inline static void print() {
printLine(I, 1);
}
};
template <int NUM, int N>
struct Group {
inline static void print() {
Group<NUM, N - 1>::print();
cout << endl;
Line<N, NUM>::print();
}
};
template <int NUM>
struct Group<NUM, 1> {
inline static void print() {
Line<1, NUM>::print();
}
};
template <int NUM>
struct Meta99 {
inline static void print() {
Group<NUM,NUM>::print();
}
};
int main() {
Meta99<20>::print();
return 0;
}
--
Now.in 網路廣播平台
http://now.in
哇咧咧 創意投票系統
http://walele.com
易記學 程式設計教學
http://ez2learn.com/
VICTOR's 個人Blog
http://blog.ez2learn.com/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.165.223.152
推 ledia:感覺這個討論串又要進入離奇的領域了 02/02 15:33
※ 編輯: StubbornLin 來自: 218.165.223.152 (02/02 15:43)
→ StubbornLin:我比較期待全用STL的版本 XDD 02/02 15:44
→ StubbornLin:我在想如果有程式課出99乘法表 有人交這樣的版本的話 02/02 15:46
→ StubbornLin:助教看到的表情會是怎樣 XD 02/02 15:46
→ james732:助教:看不懂,這個學弟(妹)好強,滿分 02/02 15:47
推 Yshuan:助教看不懂是零分吧~ 02/02 15:50
→ StubbornLin:Meta99<100>::print(); 編好久 XDDDD 02/02 15:53
→ StubbornLin:好像編不出來= =........ 02/02 15:54
推 x000032001:這..XDDD 02/02 16:13
推 pharaoh7:這 好高級喔..... 02/02 16:30
推 lungswu:好強大的C++,有沒有tool可以轉成C的語法?這對工作很有益 02/02 16:39
推 VictorTom:果然~~小弟我就知道我完全不懂C++....Orz 02/02 16:50
推 jhchou:當初看effective c++看到meta programming的時候 02/02 17:11
→ jhchou:心中的感想只有三個字:這啥小 02/02 17:12
推 littleshan:新版的 effective c++ 有講到 meta programming 嗎? 02/02 18:04
推 jhchou:3/e有 Item 48: Be aware of template metaprogramming 02/02 18:26
→ StubbornLin:這東西我覺得炫技成份大重= = 不怎麼實用 02/02 18:35
→ StubbornLin:太難理解 加上compiler負擔太大 程式也難寫 02/02 18:38
推 bil193:雖compiler負擔大,但執行的時候變很快 02/03 00:45
→ StubbornLin:是跑超快沒錯= = 只是我覺得付出其它的部份太大 02/03 00:56
→ StubbornLin:而且要效能逼成這樣非得用meta-programming解決 02/03 00:57
→ StubbornLin:的場合也很少 所以我總覺得這樣玩太炫技 XD 02/03 00:57
→ StubbornLin:要找到能維護這類程式的人應該很難 我自己也只懂皮毛 02/03 00:58
→ adxis:用compile time去換的 執行都是常數時間 有人試過多大會 02/03 03:59
→ adxis:爆嗎? 02/03 03:59
→ sunneo:看compiler設定值 02/05 01:00