1. 程式人生 > >【C++深度剖析教程40】使用數值型模板技術計算1+2+3+...+N的值

【C++深度剖析教程40】使用數值型模板技術計算1+2+3+...+N的值

上一篇文章學習了數值型模板技術,並利用相關技術,實現了C++的陣列類模板。點選文章檢視上一篇文章:點選連結檢視

本篇文章,繼續利用模板技術來解決一個問題。

如果想求1+2+3+…+N的結果,有很多種方法。可以迴圈遍歷,可以直接使用公式求解。但是他們都不是最快的方法,我們今天使用模板技術,來最快速的求出結果。

1、回顧

模板引數可以是數值型引數。也就是非型別引數。如下圖所示:
在這裡插入圖片描述

我們可以像上面定義一個區域性陣列,但是卻不能這樣定義:

int n=10;
func<double,n>();

上面這種寫法就是錯的!!!

實際上,不光是型別引數不能為數值型模板引數,下面幾種情況也不能作為模板引數

  • 浮點數不能作為模板引數
  • 變數不能作為模板引數(上面的int n)
  • 類物件不能作為模板引數

實際上,數值型模板引數是必須在編譯階段被處理的單元,因此在編譯階段數值型模板引數必須被準確無誤的確定。向上面的變數,類物件等,都是隻有在執行的時候才能夠被確定的,所以不能作為數值型模板的引數。

2、解決方法

如果想求1+2+3+…+N的結果,有很多種方法。可以迴圈遍歷,可以直接使用公式求解。但是他們都不是最快的方法,我們今天使用模板技術,來最快速的求出結果。

先上程式碼,看看如何最快速求解:

#include <iostream>
#include
<string>
using namespace std; template < int N > //這裡是數值型模板引數 class Sum { public: static const int VALUE = Sum<N-1>::VALUE + N; //這裡是一個遞迴的過程 }; /* 遞迴過程的終止條件 */ template < > class Sum < 1 > { public: static const int VALUE = 1; }; int main() { cout <<
"1 + 2 + 3 + ... + 10 = " << Sum<10>::VALUE << endl; cout << "1 + 2 + 3 + ... + 100 = " << Sum<100>::VALUE << endl; return 0; }

上面的程式碼執行結果為:

在這裡插入圖片描述

很明顯,結果完全正確!!!

那麼為什麼它是最快的方法呢?

首先,我們知道,數值型模板引數都是在編譯階段確定了的,所以,上述程式碼的VALUE實際上是在編譯的時候,就已經確定好了值,最後直接呼叫這個值,就是計算結果。這肯定比任何計算都要快(這歸功於編譯器,編譯器為我們做了很多事)。

本文參考狄泰軟體學院相關課程
想學習的可以加狄泰軟體學院群,
群聊號碼:199546072

學習探討加個人(可以免費幫忙下載CSDN資源):
qq:1126137994
微信:liu1126137994