Thursday, November 19, 2009

3*(2+1)

Один из нескольких способов вычислить 3*(2+1) на C++.

#include <iostream>

//
struct empty_t {};

template<class Value, class Children = empty_t>
struct Node
{
typedef Value value;
typedef Children children;
};

template<class TA, class TB = empty_t>
struct Tree
{
typedef TA ta;
typedef TB tb;
};
//

//
struct Add
{
template<int A, int B>
struct Do { enum { value = A + B }; };
};

struct Mul
{
template<int A, int B>
struct Do { enum { value = A * B }; };
};

template<int X>
struct Val
{
enum { val = X };
};
//

//
template<class NodeT>
struct compute;

// если узел - это число
template<class ValueT>
struct compute<Node<ValueT, empty_t> >
{
enum { value = ValueT::val };
};

// если узел - это операция
template<class ValueT, class ChildrenT>
struct compute<Node<ValueT, ChildrenT> >
{
enum
{
A = compute<typename ChildrenT::ta>::value,
B = compute<typename ChildrenT::tb>::value,
value = ValueT::template Do<A, B>::value
};
};

int main()
{
// 3*(2+1)
typedef Node<
Mul,
Tree<
Node<Val<3> >,
Node<
Add,
Tree<
Node<Val<2> >,
Node<Val<1> >
>
>
>
> expr;

std::cout << compute<expr>::value << std::endl; // 9
}

По-моему, неплохой способ свести кого-нибудь с ума. Вообще не об этом. О том, что с помощью шаблонов можно забавно описывать статические древовидные структуры.

No comments:

Post a Comment