前些日子有人在PTT C++版問了99乘法表相關的問題,於是我手癢就寫了一個C++ Meta-Programming的版本,沒用真正寫過Meta-Programming,因為感覺上實在是太炫技了,像是帕格尼尼的炫技曲似的,如果inline最佳化都成功的話,應該是會整個被展開來,用的是編譯時間來換效能,因為和一般的程式寫法和思考方式都不太一樣,所以這樣的東西還是盡量別亂用的好,不然別人通常都難以維護,所以這只是純寫好玩的
如果你在修C++的課,剛好遇到99乘法表的作業,或許你可以把這拿去交,看助教看了會有什麼反應 XD
以下是程式碼
<code> #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; } </code>


原始碼都被跳脫啦~
改好了,只是多了個code標籤真討厭= =
如果能和你多多交流,肯定能学到不少的东西。
我来放个自己写的:
#include
template
struct Calc_I_mult_J
{
static void f(){
Calc_I_mult_J::f();
std::cout<<I*J<<"\t";
}
};
template
struct Calc_I_mult_J
{
static void f(){
std::cout<<J<<"\t";
}
};
template
struct CalcLine
{
static void f()
{
CalcLine::f();
Calc_I_mult_J::f();
std::cout<<std::endl;
}
};
template
struct CalcLine
{
static void f(){}
};
int main()
{
CalcLine::f();
return 0;
}
二二十乘法表XD