Ten wpis rozpoczyna cykl dotyczący
metaprogramowania, ilość oraz częstotliwość publikacji kolejnych
części pozostaje nieustalona.
Poniżej zaprezentowane zostanie
absolutny elementarz, czyli wyznaczanie dowolnego elementów wyrazu
ciągu Fibonacciego w czasie kompilacji.
#include <iostream>
template<unsigned int N>
struct Fib
{
static const unsigned int el =
Fib<N-1>::el + Fib<N-2>::el;
};
template<>
struct Fib<0>
{
static const unsigned int el = 0;
};
template<>
struct Fib<1>
{
static const unsigned int el = 1;
};
int main(void)
{
const unsigned int N = 5;
std::cout << "fib( "
<< N << " ) = " << Fib<N>::el <<
std::endl;
return 0;
}
Tych parę linijek zmusza do wyliczenia
5 elementu ciągu Fibonacciego kompilator, co oznacza że jedynymi
instrukcjami jakie zostaną wykonane przez nasz program po
skompilowaniu będą te odpowiedzialne za wyświetlenie stosownej
informacji na ekranie. Analizując powyższy kod widzimy template
struktury Fib. Struktura ta zawiera jedną statyczną stałą el
której wartość definiowana jest w sposób rekurencyjny. Następnie
wyspecjalizowano strukturę Fib oraz wartość statycznej zmiennej el
dla odpowiednich wartości N (0 oraz 1). Takie podejście spowoduje
iż rekurencyjne rozwinięcie będzie miało miejsce podczas procesu
kompilacji. Należy zaznaczyć że Fib<1> oraz Fib<0> to
tak naprawdę dwa różne typy (podobnie dla wszystkich wartości
pośrednich od 0 do N). Możliwości prawidłowego działania
mojego kompilatora (gcc version 4.7.2 Ubuntu/Linaro 4.7.2-2ubuntu1)
kończą się gdzieś między 1800 a 1900 elementem ciągu. Jak zatem
widać podejście takie ma swoje ograniczenia do najważniejszych
należy fakt iż w tym przypadku konieczna jest ustalenie który
element ciągu chcemy pozyskać już w momencie kompilacji.
Prezentowany przykład może nie wydawać się nazbyt praktyczny i w
rzeczywistości taki właśnie jest. Jego zadaniem jest zwrócenie
jedynie uwagi na pewne szczególne podejście do szblonów oraz
metaprogramowania, więcej na ten temat można znaleźć w linkach
poniżej oraz w kolejnych wpisach na tym blogu dotyczących
metaprogramowania.
Linki:
Komentarze
Prześlij komentarz