99乘法表C++ Meta Programming版

前些日子有人在PTT C++版問了99乘法表相關的問題,於是我手癢就寫了一個C++ Meta-Programming的版本,沒用真正寫過Meta-Programming,因為感覺上實在是太炫技了,像是帕格尼尼的炫技曲似的,如果inline最佳化都成功的話,應該是會整個被展開來,用的是編譯時間來換效能,因為和一般的程式寫法和思考方式都不太一樣,所以這樣的東西還是盡量別亂用的好,不然別人通常都難以維護,所以這只是純寫好玩的

如果你在修C++的課,剛好遇到99乘法表的作業,或許你可以把這拿去交,看助教看了會有什麼反應 XD

以下是程式碼



#include 

using namespace std;

inline void printLine(int i, int j) {
    cout << i << " * " << j  << " = " << i * j << endl;
}

template 
struct Line {
    inline static void print() {
        Line::print();
        printLine(I, J);
    }
};

template 
struct Line {
    inline static void print() {
        printLine(I, 1);
    }
};

template 
struct Group {
    inline static void print() {
        Group::print();
        cout << endl;
        Line::print();
    }
};

template 
struct Group {
    inline static void print() {
        Line<1, NUM>::print();
    }
};

template 
struct Meta99 {
    inline static void print() {
        Group::print();
    }
};

int main() {
    Meta99<20>::print();
    return 0;
}


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

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>