編譯期就是編譯器進行編譯,產生.obj文件的所處的那一段時間(若是是廣義的編譯期,那麼通常還包括了連接期,由於如今不少編譯器都會自動調用連接器進行連接)
執行期就是你執行某個已經連接好的程序的那段時間。
簡單點說 :
「編譯期」就是你在VS2008中按F7開始到 Build success 這段時間
「執行期」就是你在VS2008中按Ctrl+F5並提供相應的參數到結果出來這段時間。
如何實現
編程
模板元編程使用靜態C++語言成分,編程風格相似於函數式編程( 函數式編程是一種編程模型,他將計算機運算看作是數學中函數的計算,而且避免了狀態以及變量的概念。 ),在模板元編程中,主要操做整型(包括布爾類型、字符類型、整數類型)常量和類型,不可使用變量、賦值語句和迭代結構等。被操縱的實體也稱爲元數據(Metadata),全部元數據都可做爲模板參數。 因爲在模板元編程中不可使用變量,咱們只能使用typedef名字和整型常量。它們分別採用一個類型和整數值進行初始化,以後不能再賦予新的類型或數值。若是須要新的類型或數值,必須引入新的typedef名字或常量。
語法模擬:
判斷
函數式編程
Template <bool cond, typename T_true, typename T_false>
Struct IfElse
{ typedef T_true TypeResult; };
函數
Template <typename T_true, typename T_false>
Struct IfElse<false, T_true, T_false> //特化 bool 爲 false 的情形
{ typedef T_false TypeResult; };
舉例來講 : ui
IfElse <(1+1 == 2) , char , int >::TypeResult result; //TypeResult == char ……
分支判斷spa
Template <bool > Struct If; //聲明一個模版類
Template <>
Struct If<false>//特化 bool 爲 false 的情形
{ static void foo() {…} };
Template <>
Struct If<true> //特化 bool 爲 true 的情形
{ static void foo() {…} };
Switch 實現遞歸
template <bool, typename T_true, typename T_false>
struct IfElse
{ typedef T_true TypeResult; };
template <typename T_true, typename T_false>
struct IfElse<false,T_true,T_false>
{ typedef T_false TypeResult; };
const int c_switch_default = -1;
struct NullCase {};
template < int _tag , typename _Type , typename _Next = NullCase>
struct Case
{ enum { tag = _tag };
typedef _Type Type;
typedef _Next Next;
};編譯器
template <int _tag, typename Case >
struct Switch
{ private:
typedef typename Case::Next NextCase;
enum { caseTag = Case::tag, found = (caseTag == _tag || caseTag == c_switch_default)}; public: typedef typename IfElse<found, typename Case::Type, typename Switch<_tag, NextCase>::Result>::TypeResult Result; };
template <int tag>
struct Switch<tag, NullCase>
{ typedef NullCase Result; };
數學
struct A
{
static void excute()
{
std::cout<<" A "<<std::endl;
}
};it
struct B
{
static void excute()
{
std::cout<<" B "<<std::endl;
}
};編譯
struct C
{
static void excute()
{
std::cout<<" Default "<<std::endl;
}
};
舉例來講 :
Switch< (1+1) ,
Case<1, A,
Case<2, B,
Case<c_switch_default, C> > > >::Result::excute();
//這個時候就會輸出 「 B"
遞歸
先定義一個模板, 它是遞歸的(通常狀況下, 都會出現X<N-1>或者相似的寫法) 定義遞歸結束的模板
示例1:序列求和
template <int N> struct Sum { static const int nResult = Sum<N-1>::nResult + N; }; template <> struct Sum<0> { static const int nResult = 0; };
示例2:二進制換算十進制
template <int N>
struct bin
{ static const int value = bin<N/10>::value << 1 | (N%10); };
template <>
struct bin<0>
{ static const int value = 0; };
若是有人看, 我還會堅持寫下去