#include <iostream>

template<int src, int dst>
struct move_disc
{
	move_disc() {
		std::cout << "move " << src << " to " << dst << "\n";
	}

};

template<int n, int src, int tmp, int dst>
struct hanoi
{
    hanoi<n-1, src, dst, tmp> before;
    move_disc<src, dst> disc;          // normal member
    hanoi<n-1, tmp, src, dst> after;
};

template<int src, int tmp, int dst>
struct hanoi<0, src, tmp, dst>
{
    // recursive base case
};


int main() {
	hanoi<3, 1, 2, 3> go;
}