模版程式設計 在編譯期完成遞迴工作

2022-03-08 06:58:20 字數 1110 閱讀 9844

斐波那契數

斐波那契數形如:0,1,1,2,3,5,8,13.....。該序列的通用方程式:fib(n)=fib(n-1)+fib(n-2),遞迴生成斐波那契數的典型函式如下:

unsigned recursivefib( unsigned n)

這個程式的時間複雜度是指數級的,它非常低下,根本不能應用於產品中。

但是距離模板化版本只有一步之遙。 

template< unsigned n> struct fib;};

//模板特化,結束條件

template <> struct fib <0> ; };

template <> struct fib <1> ; };

//讓該模板形如函式

#define fibt( n ) fib< n >::val

通過#define「呼叫」此模板:

std::cout<< fibt( 4 );   //fib< 4 >::val

此模板化版本有幾個注意點:

1.此模板數不是真正的函式-----它是叫做val的列舉型別,在編譯期遞迴生成,

val=fib< n-1 >::val+fib< n-2 >::val並不常見,但是合法。

2.模板引數n用於指定函式的輸入,並不常見,但完全可行。

3.要終止遞迴,需要正確處理結束條件,對斐波那契數來說,結束條件是n為0和1時,

本模板中使用的是模板特化。

4.如果當i還是可變的變數時呼叫fibt(i),將會產生編譯錯誤。

=fib< 4 >::val

=fib< 3 >::val + fib< 2 >::val

=fib< 2 >::val +fib< 1>::val + fib< 1 >::val + fib< 0 >::val

=fib< 1>::val + fib< 0 >::val + 1+1+0

=1+0+1+1+0

=3由於所有的輸入在編譯器都確定了,所以編譯程式可以將fib< n >換算成常數。

std::cout<< fibt( 4 );//與3完全等價 

該方法可以成為你c++工具包中的有用工具,你很可能會有指數級執行時間不能降為零的情況,通過使用模板元程式設計,就可以通過增加額外的編譯時間來減少執行時間。

C Ado 在編譯的時候,報錯。

其中錯誤提示如下 fatal error c1083 cannot open type library file c program files common files system ado msjro.dll no such file or directory 1 首先確定在標頭檔案ado2.h...

static assert 是在編譯時期的斷言

static assertion static assert 是在編譯時期的斷言,作用不言而喻的。語法是這樣 static assert bool constexpr string 其中 bool constexpr 常量表示式 string 如果bool constexpr表示式為false,這個...

Magic Number 在程式設計中的使用

magic no,好方法!假設我們有了一大塊緩衝區 以下稱buffer say,1m,這一塊緩衝區將用來滿足很多小的順序到來的記憶體請求,並且,其釋放先後次序和申請次序一致。我們可以考慮採用環形佇列來解決這個問題。為了記錄分配出去的記憶體塊 以下稱buflet 的大小 狀態等資訊,需要對記憶體區進行...