【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
總結
以上是生活随笔為你收集整理的【C++深度剖析教程40】使用数值型模板技术计算1+2+3+...+N的值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端组件库大合集-必备收藏
- 下一篇: 【C++深度剖析教程5】C++中类的静态