Thursday, July 8, 2010

Шаблонно метапрограмиране със C++
Шаблоните (templates) са интригуваща част от езика C++. С тяхна помощ е построена например стандартната библиотека. Те позволяват създаването на алгоритми, независещи от конкретната стуктура от данни.
Важен аспект на шаблоните е, че те съществуват единствено по време на компилацията. Работа на компилатора е да превърне шаблоните в съответни класове. Добър оптимизиращ компилатор може да превърне шаблонните конструкции в също толкова ефективен машинен код, колкото и ръчно изработения.
Да разгледаме един примеp от стандартната библиотека:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int twice(int a){ return a * 2; }

void printint(int a){ cout << a << ' '; }

int main(){
vector<int> v;
int a[10];
for(int i = 0; i < 10; ++i) a[i] = i;

// Initialize the vector with the contents of other container
v.assign(a, a + 10);

// Perform an algorithm over vector<int>
transform(v.begin(), v.end(), v.begin(), twice);
// Perform the same algorithm over int[]
transform(a, a+10, a, twice);
// Another algorithm over the vector, which uses the greater<> function object template
sort(v.begin(), v.end(), greater<int>());
// Using for_each algorithm, print the elements in v by a function
for_each(v.begin(), v.end(), printint);

return 0;
}

Различните алгоритми действат върху различни структури от данни. В STL това е постигнато чрез въвеждане на концепцията за итератор, който абстрактен обект, позволяващ достъп до елементите на контейнер по определен начин. Например функцията transform може да се реализира по следния начин:

template<typename InputIterator, typename OutputIterator, typename UnaryFunction>
void transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction func){
while(first != last){
*result = func(*first);
first++;
result++;
}
}

1 Comments:

Blogger comco said...

ahit

July 11, 2010 at 7:26 AM  

Post a Comment

Subscribe to Post Comments [Atom]