元編程(Metaprogramming)是指某類計算機程序的編寫,這類計算機程序編寫或者操縱其餘程序(或者自身)做爲它們的數據,或者在運行時完成部分本應在編譯時完成的工做。不少狀況下與手工編寫所有代碼相比工做效率更高。編寫元程序的語言稱之爲元語言,被操做的語言稱之爲目標語言。一門語言同時也是自身的元語言的能力稱之爲反射。ios
一個簡單元編程的例子是使用bash腳本的
產生式編程示例:
#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)) do
echo "echo $I" >>program
done
chmod +x program
這個腳本(或程序)生成了一個新的993行程序來打印1至992。這只是演示用代碼來寫更多代碼,並非打印數字的最有效方法。然而,一個程序員能夠幾分鐘內編寫和執行
元程序,卻生成了近1000行代碼。
==========
C++中也可使用模板來進行元編程(如下代碼在VC2008中編譯經過):
#include<iostream>
using namespace std;
int Result;
//主模板
template<int N> //模板
class Fibonacci
{
public:
enum{Result = Fibonacci<N-1>::Result + Fibonacci<N-2>::Result };
//枚舉,帶有隱含計算
};
//徹底特化模板
template<>
class Fibonacci<1> //帶常參數1的
構造函數
{
enum { Result = 1 };
//給枚舉賦初值1
};
//徹底特化模板
template<>
class Fibonacci<0> //帶參數0的模板
{
public:
enum { Result = 0 };
//給枚舉賦初值0
};
int main()
{
std::cout << "第20項的Fibonacci數是:" << Fibonacci<20>::Result << std::
endl;
//隱含計算
system("pause");
return 1;
}
該示例定義了一個
類模板,類中聲明瞭一個
枚舉類型,該程序的奧祕就在枚舉類型的構造上。從枚舉類型的構造能夠看出,他自身有一個樣俺的
迭代計算。兩個
構造函數爲枚舉類型初始化了數列的初始值,當調用「Fibonacci<20>::Reasult「時,就以這兩個初始值爲基礎進行
迭代。所以,程序在運行時並無顯示的計算,而是在編譯時就由
編譯器計算了。
當編譯器實例化Fibonacci<20>時,爲了給其enum Result賦值,編譯器須要對Fibonacci<19>和Fibonacci<18>進行實例化,以後同理······,當實例化到Fibonacci<1>和Fibonacci<0>的時候,徹底特化模板被實例化,至此迭代結束。
元編程是:關於程序的程序、操縱代碼的程序。
應用:編譯時計算、補充類型系統、基於模板的計算
優勢:加強代碼重用,編譯時計算,不佔用運行時cpu。
缺點:代碼可讀性較差,調試困難,編譯時間延長,侷限性(數值計算)
主要思想:利用模板特化機制實現編譯期條件選擇結構,利用遞歸模板實現編譯期循環結構,模板元程序則由編譯器在編譯期解釋執行。
模板元編程使用靜態c++語言成分,編程風格相似於函數式編程,其中不可使用變量、賦值語句和迭代結構等。
在模板元編程中,主要操做整形(包括布爾類型、字符類型、整數類型)常量和類型。被操縱的實體也稱爲元數據。全部元數據都可做爲模板參數。