#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