template< unsigned int N >
struct Fib
{
enum
{
Val = Fib< N-1 >::Val + Fib< N-2 >::Val
};
};
template <> struct Fib<0> { enum { Val = 0 }; };
template <> struct Fib<1> { enum { Val = 1 }; };
#define FibT( n ) Fib< n >::Val
template< unsigned int N >
inline unsigned int Fib2(void)
{
return Fib2< N-1 >() + Fib2< N-2 >();
}
template<>
inline unsigned int Fib2<0>(void)
{
return 0;
}
template<>
inline unsigned int Fib2<1>(void)
{
return 1;
}
#define Fib2T( n ) Fib2< n >()