// size of the chessboard const int size = 8; // some bookkeeping template <class C, class F, class S> struct state { typedef C columns; typedef F first_diag; typedef S second_diag; typedef state<C,F,S> this_type; template <class Col, class Row> struct calc_diag { typedef item<Row::id + Col::id> first_d; typedef item<size - 1 - Row::id + Col::id> second_d; }; template <class Col, class Row> struct isValid : calc_diag<Col,Row> { static const bool result = inSet<columns, Col>::result && inSet<first_diag, first_d>::result && inSet<second_diag, second_d>::result ; }; template <class Col, class Row> struct use : calc_diag<Col,Row> { typedef typename select < null, state< typename remove<columns, Col>::result, typename remove<first_diag, first_d>::result, typename remove<second_diag, second_d>::result>, this_type::isValid<Col, Row>::result >::result result; }; };