C 的模板 四 編譯問題

2021-10-23 22:41:12 字數 1782 閱讀 8282

現在,換一種方式來看hanoi塔問題。這次用模板。來看這段**:

#include

using

namespace std;

template

<

int n,

int a,

int b,

int c>

class

tower};

template

<

int a,

int b,

int c>

class

tower

<

1,a,b,c>};

intmain()

**是超級簡單的。大於一層的hanoi塔含有兩個子hanoi塔問題,它們的型別分別是tower和tower。移動盤子的操作是在建構函式裡完成的。所以,定義乙個hanoi變數就好了,什麼都不用做。

這段**編譯時會給編譯器帶來什麼樣的開銷呢?因為每個tower例項,都用到了兩個n-1層的子型別,咋一看一共生成2的n次方-1個型別。然而,根據完全2-叉樹的推算公式每一層有2的i次方個節點。而每一層,按a,b,c的全排列,最多只能生成6個型別,所以沒那麼多。數學推導就不做了,仍然利用這個**自動計算數一下。

#include

using

namespace std;

#define max 10

int count[max][6

];enum

;#define test_val(a,b,c) (a<<8|b<<4|c)

intadd

(int n,

int a,

int b,

int c)

return1;

}template

<

int n,

int a,

int b,

int c>

class

tower};

template

<

int a,

int b,

int c>

class

tower

<

1,a,b,c>};

intmain()

else cout <<

".";

} cout <<

"\n";}

}

這裡count陣列意外的和std命名空間的某個東西衝突了。只好在函式體裡再用extern說明一下。看來using namespace std;這句話有點大了…

這是執行結果:

move plate ...

move ...

1:. x x .

. x

2: x .

. x x .3:

. x x .

. x

4: x .

. x x .5:

. x x .

. x

6: x .

. x x .7:

. x x .

. x

8: x .

. x x .9:

. x x ...

10: x ...

..

可見除了最後兩層,每層都生成3個型別。總共是 3 *(n-2) +3 = 3 *n -3

編譯器總共例項化生成 3 *n -3個tower型別。

C 模板的編譯問題

c 編譯器與鏈結器工作原理 講了一下 c 對於模板,包括模板類與模板函式,它們的 其實並不是直接翻譯成二進位制 它要求有乙個 具體化 的過程,舉個例子 template void funa t t int main 也就是說,如果在 main 函式中,沒有呼叫過 funa 函式的話,那麼在 main...

C 模板的編譯問題

對於模板,包括模板類與模板函式,它們的 其實並不是直接翻譯成二進位制 它要求有乙個 具體化 的過程,舉個例子 template void funa t t int main 也就是說,如果在main函式中,沒有呼叫過funa函式的話,那麼在main.obj中就找不到關於funa的任意二進位制 如果呼...

C 模板的編譯問題

對於模板,包括模板類與模板函式,它們的 其實並不是直接翻譯成二進位制 它要求有乙個 具體化 的過程,舉個例子 template void funa t t int main 也就是說,如果在main函式中,沒有呼叫過funa函式的話,那麼在main.obj中就找不到關於funa的任意二進位制 如果呼...