//: C05:Accumulate.cpp
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// předává "funkci" jako parametr v době překladu.
#include <iostream>
using namespace std;

// Hromadí výsledky F(0)..F(n)
template<int n, template<int> class F> struct Accumulate {
  enum { val = Accumulate<n-1, F>::val + F<n>::val };
};

// Ukončovací kritérium (vrací hodnotu F(0))
template<template<int> class F> struct Accumulate<0, F> {
  enum { val = F<0>::val };
};

// Různé "funkce":
template<int n> struct Rovnost {
  enum { val = n };
};

template<int n> struct Ctverec {
  enum { val = n*n };
};

template<int n> struct Krychle {
  enum { val = n*n*n };
};

int main() {
  cout << Accumulate<4, Rovnost>::val << endl; // 10
  cout << Accumulate<4, Ctverec>::val << endl;   // 30
  cout << Accumulate<4, Krychle>::val << endl;     // 100
} ///:~
