2010-06-29 34 views
1

我認爲我的問題是,是否有模仿我們將從C++ 0x的constexpr關鍵字獲得的行爲以及當前的C++標準(也就是說,如果我理解constexpr應該是假設的做正確的)。在const表達式中重用函數邏輯

更清楚的是,在編譯時有時計算一個值是有用的,但是它也可以在運行時對它進行計算,例如,如果我們想計算權力,我們可以使用下面的代碼。

template<int X, unsigned int Y> 
struct xPowerY_const { 
    static const int value = X*xPowerY_const<X,Y-1>::value; 
}; 

template<int X> 
struct xPowerY_const<X, 1> { 
    static const int value = X; 
}; 

int xPowerY(int x, unsigned int y) { 
    return (y==1) ? x : x*xPowerY(x,y-1); 
} 

這是一個簡單的例子,但在更復雜的情況是能夠重複使用的代碼將是有益的。即使對於運行時性能而言,函數的遞歸性質並不理想並且可以設計出更好的算法,但是如果模板化版本可以在函數中表達,那麼測試邏輯將是有用的,因爲我看不到合理的方法在很多情況下測試常量模板方法的有效性(雖然也許有一個,我只是看不到它,也許這是另一個問題)。

謝謝。

編輯 忘了提,我不想#define

EDIT2也高於我的代碼是錯誤的,它不隨x^0交易,但是這並不影響題。

+2

爲什麼'constexpr'函數被添加到語言中的原因正是爲了能夠做到這一點。 – 2010-06-29 17:57:46

+0

@Pavel,是的,這是有道理的 - 確實認爲我發佈時,爲什麼他們會添加它,如果它已經可以完成,但我想我會嘗試,以防萬一 – tjm 2010-06-29 18:05:36

回答

4

模板元編程以與「正常」C++代碼完全不同(並且不兼容)的方式實現邏輯。你沒有定義一個函數,你正在定義一個類型。只是碰巧類型有一個與其相關的值,它是由其他類型的組合構建的。

由於模板定義了類型,因此不涉及程序邏輯。邏輯只是編譯器試圖解決模板化類型之間關係的一個副作用。真的沒有辦法從模板「程序」中自動提取高級邏輯到函數中。當模板首次實現時,模板元編程甚至不是Bjarne的眼中的一絲閃光。他們實際上是,後來在該語言的用戶的語言生活中發現了。這是剛剛變得非常流行的類型系統的「意外」副作用。正是由於這一發現,語言中增加了新的功能,以更全面地支持已經演變的成語。

+0

謝謝,好的答案。不是我所希望的那個,但我擔心的是正確的一個:) – tjm 2010-06-29 18:01:43