99乘法表C++ Meta Programming版

前些日子有人在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>
This entry was posted in 中文文章, C/C++ and tagged , . Bookmark the permalink.

5 Responses to 99乘法表C++ Meta Programming版

  1. 原始碼都被跳脫啦~

  2. victor says:

    改好了,只是多了個code標籤真討厭= =

  3. 潘飞 says:

    如果能和你多多交流,肯定能学到不少的东西。

  4. MichaelGenn says:

    我来放个自己写的:

    #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;
    }

  5. ooxx says:

    二二十乘法表XD

發表迴響

您的電子郵件位址並不會被公開。 必要欄位標記為 *

*

您可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">