head::type
ãªã¹ãã¢ã€ãã LïŒãªã¹ããããïŒãè¿ããŸã
index_of<T,L>::value
ãªã¹ãLã§ã¿ã€ãTãæåã«çŸããäœçœ®ãè¿ããŸããã¿ã€ããèŠã€ãããªãå Žåã¯ã-1
length::value
ã¿ã€ãLã®ãªã¹ãã®é·ããå®çŸ©ããŸã
merge<L1,L2>::type
2ã€ã®ãªã¹ãL1ãšL2ã1ã€ã®ãªã¹ãã«çµåããŸã
organize::type
ç¡å¹ãªLã¿ã€ãã®ãªã¹ããæ£ãããªã¹ãã«å€æããŸãã
normalize::type
ãªãŒã¬ãã€ãºãšåãã§ãããLãã¿ã€ãã®ãªã¹ãã§ã¯ãªãå Žåã1ã€ã®èŠçŽ ã®ãªã¹ãã«å€æããŸã
push_back<T,L>::type
ã¿ã€ãTããªã¹ãLã®æåŸã«è¿œå ããŸã
push_front<T,L>::type
ã¿ã€ãTããªã¹ãLã®å
é ã«è¿œå ããŸã
reverse::type
ãªã¹ãLã®èŠçŽ ã®é åºãå察ã«å€æŽããŸã
split<I,L>::left_list
split<I,L>::right_list
split_c<int,L>::left_list
split_c<int,L>::right_list
ãªã¹ãLãäœçœ®Iã§2ã€ã®ãªã¹ãã«åå²ããŸã
tail::type
ãªã¹ãLã®æ«å°Ÿãè¿ããŸãïŒãªã¹ãã®æåã®èŠçŽ ãåé€ããŸãïŒ
type_at<I,L>::type
type_at_c<int,L>::type
ãªã¹ãLã®äœçœ®Iã«ããåãè¿ããŸã
type_count<T,L>::value
ã¿ã€ãLã®ãªã¹ãå
ã®ã¿ã€ãTã®æ°
unique::type
åãªã¹ãLå
ã®ãã¹ãŠã®éè€èŠçŽ ãåé€ããæåŸã®åºçŸãæ®ããŸã
unique_first::type
uniqueãšåãã§ãããèŠçŽ ã®æåã®åºçŸãæ®ããŸã
ãã®ãªã¹ãã«ã¯ãæå®ãããset_atäœçœ®ã§åã眮ãæããïŒç§»åããããã«å¿
èŠã§ãïŒãåã®ãªã¹ãã®æåŸã®èŠçŽ ãæåŸã«ååŸãããªã©ãæãããªæäœã¯ãããŸããã ããã¯ããã®èšäºã§èª¬æããfaslibããã±ãŒãžããã¡ã€ã³ã®faslibããã±ãŒãžã§ããfas / aopããã±ãŒãžãäž»ã«ãµããŒãããããã«èšèšãããŠããããã§ãã ããããããã«ã¯set_atã®ãããªæäœã¯å¿
èŠãããŸããã ããŠããã®èª€è§£ãä¿®æ£ããŸãããã
æåŸã®èŠçŽ ãååŸããã«ã¯ãåãªã¹ãã®é·ãïŒfas :: lengthïŒãèšç®ããæåŸãã2çªç®ã®äœçœ®ã«ããåïŒfas :: type_atïŒãååŸããå¿
èŠããããŸãã
template<typename L> struct last { typedef typename fas::type_at_c< fas::length< L >::value-1, L >::type type; };
set_atæäœã¯ãã¿ã€ããªã¹ãã®æå®ãããäœçœ®ã«ã¿ã€ããèšå®ããŸãã ãŸããäœçœ®ãšããŠæ°å€ãåãset_at_cãéçºããŸãã ã³ã³ãã€ã«æéãæå°éã«æããã«ã¯ããã®æäœãã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã«å®è£
ããæ¹ãå¹ççã§ãããç°¡åã«ãªããŸã-å©çšå¯èœãªæäœã䜿çšããŸãã ãããè¡ãã«ã¯ïŒ
- åã®ãªã¹ãã2ã€ã®ãªã¹ãã«åå²ããŸãïŒfas :: splitïŒ
- 2çªç®ã®ãªã¹ãã§ãé ãåãåããŸãïŒfas :: tailïŒ
- æå®ããã¿ã€ããæé ãªã¹ãã®å
é ã«è¿œå ããŸãïŒfas :: push_frontïŒ
- å·Šå³ã®å€æŽããããªã¹ããçµåããïŒfas :: mergeïŒ
template<int Pos, typename T, typename L> struct set_at_c { typedef fas::split_c<Pos, L> splitter; typedef typename splitter::left_list left_list; typedef typename splitter::right_list right_list; typedef typename fas::tail< right_list >::type headless; typedef typename fas::push_front< T, headless >::type pollywog; typedef typename fas::merge< left_list, pollywog >::type type; }; template<typename Pos, typename T, typename L> struct set_at : set_at_c< Pos::value, T, L> { };
ã¢ã«ãŽãªãºã
åãªã¹ãã®æäœã«å ããŠãfaslibã¯stlã¢ã«ãŽãªãºã ã«äŒŒãå€ãã®ã³ã³ãã€ã«æã¢ã«ãŽãªãºã ãå®è£
ããŠããŸãã æäœãšã¯ç°ãªããã¢ã«ãŽãªãºã ã¯åžžã«ã¡ã¿é¢æ°ïŒã¿ã€ãã¿ã€ããå®çŸ©ãããŠããæ§é -çµæã®ã¿ã€ãïŒã§ãã å€ãã®ã¢ã«ãŽãªãºã ã¯ãåã®ãªã¹ãã«å ããŠãåé
ãŸãã¯äºé
æŒç®ãåãå
¥ããŸã-ããã¯ã1ã€ãŸãã¯2ã€ã®ãã©ã¡ãŒã¿ãŒãæã€ãã³ãã¬ãŒãã¡ã¿é¢æ°ã§ãã ã¢ã«ãŽãªãºã ãæ¡ä»¶ä»ãã®å Žåãåé
ãŸãã¯ãã€ããªã®è¿°èªïŒã¡ã¿é¢æ°ãïŒãå¿
èŠã§ãã æŽæ°åã®æ¯èŒãfas / typemanipããã±ãŒãžïŒsame_typeãsuper_subclassãªã©ïŒãŸãã¯stl <type_traits>ã¯ã©ã¹ïŒc ++ 11ã䜿çšããå Žåã¯std :: is_base_ofãªã©ïŒã®é¢æ°ãè¿°éšãšããŠäœ¿çšã§ããŸãã
æäœããã³/ãŸãã¯è¿°èªã䜿çšãããã¹ãŠã®ã¢ã«ãŽãªãºã ã«ã¯ãæ¥å°ŸèŸ_tãä»ããããŒãžã§ã³ããããŸããããã¯ããã³ãã¬ãŒããã³ãã¬ãŒããã©ã¡ãŒã¿ãšããŠæäœãšè¿°èªãåãå
¥ããŸããæ¬¡ã«äŸã瀺ããŸãã
template<typename L, template<typename> class F > struct transform_t;
ã¿ã€ãLã®ãªã¹ãã®åèŠçŽ ã«å¯ŸããŠãæäœFãé©çšããŸããäŸïŒ
typedef fas::type_list_n< fas::int_<1>, fas::int_<2>, fas::int_<3>, fas::int_<4> >::type lst; typedef fas::transform_t<lst2, fas::inc >::type res;
çµæãšããŠããªã¹ãã®åèŠçŽ ã1ãã€å¢å ããæŽæ°åã®ãªã¹ããååŸããŸãã ãµãã£ãã¯ã¹ã®ãªããªãã·ã§ã³ã«ã¯ããã¬ãŒã¹ãã«ããŒåŒã®äœ¿çšãå«ãŸããŸãã
template<typename L, typename F > struct transform;
äŸïŒ
typedef fas::transform<lst, fas::inc< fas::_ > >::type res2;
ãã¬ãŒã¹ãã«ããŒã®è©³çްãã¬ãŒã¹ãã«ããŒã¯ãäœ¿çšæ¹æ³ã説æãããããã¯ããã«äœ¿ãããããã®ã§ãã äžè¬ã«ããã¹ãŠãboost :: mplããã³c ++ 11ã«äŒŒãŠããŸãããfaslibã«ã¯_1ã_2ã_3ã_4ã_5ã®5ã€ãããªããæ®éçãª_ããããŸãã
äŸ | ä»£æ¿æ¡ |
---|
foo <_> | foo <_1> |
foo <_ã_> | foo <_1ã_2> |
foo <_1ã_ã_ 2> | foo <_1ã_1ã_2> |
foo <_1ã_ã_ 2ã_ã_> | foo <_1ã_1ã_2ã_2ã_3> |
ã€ãŸããåŒã®æåã®_ã¯_1ã2çªç®ã¯_2ãªã©ã«ãªããŸãã _以å€ã®ãã¬ãŒã¹ãã«ããŒãåŒã§äœ¿çšãããŠããå Žåã¯ãåŸè
ãå®å
šã«æŸæ£ããããšããå§ãããŸããããã§ãªãå ŽåãåŒãçè§£ããã®ãé£ãããªããŸãã åæã«ãåçŽãªããŒãžã§ã³ã§ã¯éåžžã«äŸ¿å©ã§ãã
fas :: transformã䜿çšããäŸã§ã¯ã颿°fas :: incã䜿çšããŠãæŽæ°åã1ã€å¢ãããŸããã ãã ãããã®é¢æ°ã®çµæã¯ãfas :: integral_c <intã4>ã®åœ¢åŒã®åã§ãããfas :: int_ <4>ãšæå³çã«åçã§ãããç°ãªãåã§ãã fas :: integral_cãfas :: int_ã«å€æããã«ã¯ãfas :: make_int颿°ã䜿çšã§ããŸãã
typedef fas::transform< lst, fas::make_int< fas::inc< fas::_ > > >::type res2;
å©çšå¯èœãªã¢ã«ãŽãªãºã ã®ãªã¹ãïŒ
accumulate<L, I, F<_,_>=plus >
æŽæ°åã®ãªã¹ãã®å ŽåãæŒç®FïŒããã©ã«ãã§ã¯å ç®ïŒã䜿çšããŠãIã®å€ãšãªã¹ãLã®åèšãèšç®ããŸãã æ¬¡ã®ããã«ãããããã¿ã€ãã«äœ¿çšã§ããŸã ã¿ã€ãLã®ãªã¹ãã®åã¿ã€ãTã«å¯ŸããŠãF <PredãT>ãé©çšããŸããæåã®å埩ã§ã®Predã¯åæã¿ã€ãIã§ãããåŸç¶ã®å埩ã§ã¯åã®Fã®çµæã§ãcount<T, L>
fas :: type_countãšåæ§ã§ãããfas :: count_ifããã³fas :: same_typeã䜿çšããŠãLã¿ã€ãã®ãªã¹ãå
ã®Tã¿ã€ãã®æ°ã決å®ããŸãcount_if<L, <_> >
ãªã¹ãLå
ã®æ¡ä»¶Cãæºããåã®æ°ãå®çŸ©ããŸã<_>erase_if<L, C<_> >
æ¡ä»¶C <_>ãæºãããã¹ãŠã®ã¿ã€ãããªã¹ãLããåé€ããŸãfind_if<L, C<_> >
ãªã¹ãå
ã§C <_>ïŒæåã®åºçŸïŒãæºããåãæ€çŽ¢ããŸãfor_<I, C<_>, F<_> >
æ¡ä»¶C <_>ã§åæåIã䜿çšããŠF <_>ãååž°çã«é©çšããŸãgenerator< T, F<_> >
Fã䜿çšããŠæ°ããåãçæããŸãgenerate< N, F >
åãžã§ãã¬ãŒã¿ãŒFïŒããšãã°ãfas :: generatorïŒã䜿çšããŠlong Nã®åã®ãªã¹ããçæããŸãindex_of_if<L, C<_> >
æ¡ä»¶Cãæºããåãªã¹ãå
ã®èŠçŽ ã®äœçœ®<_>is_sorted<L, <_,_>=less >
ãã€ããªãŒè¿°éšCã䜿çšããŠãã¿ã€ãLã®ãªã¹ãã®é åºã決å®ããŸãrandom_shuffle<R, L>
æŽæ°åRãæšç®ãšããŠäœ¿çšããŠãLåã®ãªã¹ããæ¬äŒŒã©ã³ãã ã«ã·ã£ããã«ããŸããselect< L, <_> >
æ¡ä»¶C <_>ãæºãããªã¹ãLããåãååŸããŸãã åºåã¯ã¿ã€ãã®ãªã¹ãã§ããshuffle< L, RL>
RLã®æŽæ°åã®ãªã¹ãã䜿çšããŠãLã®åã®ãªã¹ããã·ã£ããã«ããŸãsort<L, <_,_>=less >
ã¿ã€ãLã®ãªã¹ãããœãŒãããŸãtransform<L, F<_> >
F <_>ã®çµæãèŠçŽ ã§ããåã®ãªã¹ããè¿ããŸãtransform2<L1, L2, F<_,_> >
èŠçŽ ãF <_1ã_2>ã®çµæã§ããåã®ãªã¹ããè¿ããŸããããã§ã_1ãš_2ã¯ããããæåãš2çªç®ã®ãªã¹ãã®èŠçŽ ã§ãtransform_if< L, F<_>, C<_> >
C <_>ãæå®ãããå ŽåãèŠçŽ ãF <_>ã®çµæã§ããåã®ãªã¹ããè¿ããŸãã æ¡ä»¶ãæºããããªãå Žåãã¿ã€ãã¯å€æŽãããŸããtransform_tail<L, F<_> >
F <_>ã䜿çšããŠãåèŠçŽ ïŒãªã¹ãã®å
é ãšããŠã®èŠçŽ èªäœãå«ãïŒã®ãªã¹ãã®æ«å°Ÿã倿ŽããŸãtransform_tail_if< L, F<_>, C<_> >
C <_>ãçŸåšã®èŠçŽ ã«å¯ŸããŠå®è¡ãããŠããå ŽåãF <_>ã䜿çšããŠãåèŠçŽ ïŒãªã¹ãèªäœã®å
é ãšããŠèŠçŽ èªäœãå«ãïŒã®ãªã¹ãã®æ«å°Ÿã倿ŽããŸãunique_if<L, <_,_>=same_type >
, <_,_>unique_first_if<L, <_,_>=same_type >
, <_,_>
compile-time :
typedef fas::type_list_n< fas::int_<3>, fas::int_<2>, fas::int_<3>, fas::int_<1> >::type list1;
. , :
struct A{}; struct B:A{}; struct C:B{}; struct D:C{}; typedef fas::type_list_n< C, B, A, A, D >::type list2; typedef fas::sort< list2, fas::f< fas::super_subclass< fas::_1, fas::_2> > >::type res5;
super_subclass typemanip - faslib, .. type, value, 1, , . fas::f . c++11, fas::super_subclass, std::is_base_of, type value. , .. , - :
typedef fas::sort< list2, std::is_base_of< fas::_1, fas::_2> >::type res5;
?fas::is_sorted fas::true_, . fas::sort , , , .
, â . â . , fas::for_, fas::shuffle fas::random_shuffle , . faslib.
â fas::accumulate
struct A; struct B; struct C; typedef fas::type_list_n< A, B, C >::type list4; typedef fas::accumulate< list4, empty_list, push_front<_2, _1> >::type res4;
faslib, , -.
-.
, :
struct e {}; struct x {}; struct o {};
, python :
typedef fas::int_< #include "level.inl" > level; typedef fas::type_list_n< #include "board.inl" >::type board;
*.lnl , (. CMakeLists.txt). . rand.inl â . :
typedef fas::int_< #include "rand.inl" > initial_rand;
:
typedef fas::type_list_n< e, e, e, e, e, e, e, e, e >::type empty_board;
. :
std::ostream& operator<<(std::ostream& s, e) { s << "-"; } std::ostream& operator<<(std::ostream& s, o) { s << "O"; } std::ostream& operator<<(std::ostream& s, x) { s << "X"; }
, :
template<typename L, typename R> std::ostream& operator<<(std::ostream& s, fas::type_list<L, R>) { s << L();
ââ :
- , . fas::int_<-1>, , ( , )
- . , e ( )
- ( ). ,
ââ :
template<typename Pos, typename Fig, typename Board> std::ostream& operator<< ( std::ostream& s, fas::tuple< Pos, Fig, Board> ) { s << Board();
, ( fas::empty_list ):
template<typename Pos, typename F, typename S, typename Tail> std::ostream& operator<<(std::ostream& s ,fas::type_list<fas::tuple< Pos, F, S>, Tail>) { s << fas::tuple<Pos, F, S>() << std::endl; s << Tail(); }
. game:
template<typename R, typename Level, typename Board> struct game;
R â , , Level â , Board â â (). , , : , ( -1 ), (e â ), (empty_list ).
:
- ( )
- â : [, ]
- ,
- ( )
template<typename R, typename Level, typename Board> struct game { typedef typename figure<Board>::type fig; typedef typename available_moves<R, Level, fig, Board>::type moves; typedef typename fas::head<moves>::type result_move; typedef typename fas::first<result_move>::type position; typedef typename fas::second<result_move>::type win_fig; typedef typename do_move<position, fig, Board>::type board; typedef fas::tuple< position, win_fig, board > type; };
, , : , , â :
template<typename Board> struct figure { typedef typename fas::if_c< fas::type_count< e, Board>::value % 2 == 1, x, o >::type type; };
, , , .. .
(available_moves) : [, ], â . , -1. :
- [-1,e] â ( ), , ( )
- [-1,x] â ,
- [N,e] â N
- [N,x] â , ( )
available_moves , , :
- winner_list â , [-1,x].
- winning_moves â , , [4,o].
- blocking_moves â , [7,x].
- draw_list â [-1,e]
- , [3,e].
, , , :
template< typename R, typename Level, typename Fig, typename Board > struct available_moves { typedef typename fas::type_list_n< typename winner_list< Fig, Board >::type, typename winning_moves< Fig, Board >::type, typename blocking_moves< Fig, Board >::type, typename draw_list< Board >::type, typename free_moves<R, Level, Board >::type >::type type; };
: winner_list, winning_moves blocking_moves. , [, ]. : , . , :
x - - 0 x - - - 0
:
[[0,e],[1,e],[2,e]] [[3,e],[4,e],[5,e]] [[6,e],[7,e],[8,e]] [[0,e],[3,e],[6,e]] [[1,e],[4,e],[7,e]] [[2,e],[5,e],[8,e]] [[0,e],[4,e],[8,e]] [[2,e],[4,e],[6,e]]
, , :
template<typename, typename PairList3> struct winner_line { typedef typename fas::switch_< fas::case_c< is_win_line<x, PairList3>::value, fas::pair< fas::int_<-1>, x> >, fas::case_c< is_win_line<o, PairList3>::value, fas::pair< fas::int_<-1>, o> >, fas::default_< fas::empty_list > >::type type; };
(is_win_line<x, PairList3>), [-1,x] â , .. , , [-1,o]. â .
, , , :
template<typename Fig, typename PairList3> struct is_win_line { enum { value = fas::count_if< PairList3 , fas::same_type< Fig, fas::second<fas::_1> > >::value == 3 }; };
( , ) . , :
template<typename Fig, typename PairList3> struct has_win_pos { enum { value = fas::count_if< PairList3 , fas::same_type< e, fas::second<fas::_1> > >::value == 1 && fas::count_if< PairList3 , fas::same_type< Fig, fas::second<fas::_1> > >::value == 2 }; };
value 1, , .
, , e, , â , :
template<typename Fig, typename PairList3 > struct win_helper { typedef typename fas::if_c< has_win_pos< Fig, PairList3 >::value, typename fas::select< PairList3, fas::same_type< fas::second<fas::_1>, e> >::type, fas::empty_list >::type type; };
, , ( ) win_helper:
template<typename Fig, typename PairList3 > struct blocking_move { typedef typename fas::if_< fas::same_type<Fig, x>, o, x >::type rev_fig; typedef typename win_helper< rev_fig, PairList3 >::type type; };
, ( , e, [8,e]) . transform:
template<typename Fig, typename PairList3> struct winning_move { typedef typename fas::transform< typename win_helper< Fig, PairList3 >::type, fas::pair< fas::first<fas::_1>, Fig > >::type type; };
win_helper , . win_helper , [[4,e]] , , e (Fig). , win_helper , fas::if_.
, , , . , :
template< template<typename, typename> class Move, typename Fig, typename Board, int P0, int P1, int P2 > struct move_t { typedef typename fas::type_list_n< fas::pair< fas::int_<P0>, typename fas::type_at_c<P0, Board>::type >, fas::pair< fas::int_<P1>, typename fas::type_at_c<P1, Board>::type >, fas::pair< fas::int_<P2>, typename fas::type_at_c<P2, Board>::type > >::type pos_list; typedef typename Move<Fig, pos_list>::type type; };
Move (winner_line, blocking_move winning_move). move_t [, ], P0, P1 P2 Move.
:
template< template<typename, typename> class Move, typename Fig, typename Board > struct moves_list_t { typedef typename fas::type_list_n < typename move_t< Move, Fig, Board, 0, 1, 2 >::type, typename move_t< Move, Fig, Board, 3, 4, 5 >::type, typename move_t< Move, Fig, Board, 6, 7, 8 >::type, typename move_t< Move, Fig, Board, 0, 3, 6 >::type, typename move_t< Move, Fig, Board, 1, 4, 7 >::type, typename move_t< Move, Fig, Board, 2, 5, 8 >::type, typename move_t< Move, Fig, Board, 0, 4, 8 >::type, typename move_t< Move, Fig, Board, 2, 4, 6 >::type >::type type; };
( ) .
:
template<typename Fig, typename Board> struct winner_list : moves_list_t< winner_line, Fig, Board> {};
:
template<typename Fig, typename Board> struct winning_moves : moves_list_t< winning_move, Fig, Board> {};
:
template<typename Fig, typename Board> struct blocking_moves : moves_list_t< blocking_move, Fig, Board> {};
, (winner_line, blocking_move winning_move), . â . â , . , , , , . (winner_line, blocking_move winning_move) , . , , , , .
template<typename Board> struct draw_list { typedef typename fas::if_c< fas::type_count< e, Board >::value < 3, fas::pair< fas::int_<-1>, e >, fas::empty_list >::type type; };
, , [-1,e] â , .
, , â . , ( ) â â, .
free_moves . , , , . [, ] , e ( ).
, , ® :
template<typename R, typename Level> struct priority_positions;
:
- ( 4)
- ([0,2,6,8])
- ([1,3,5,7])
typedef fas::int_<4> center; typedef fas::type_list_n< fas::int_<0>, fas::int_<2>, fas::int_<6>, fas::int_<8> >::type corner_list; typedef fas::type_list_n< fas::int_<1>, fas::int_<3>, fas::int_<5>, fas::int_<7> >::type edge_list;
corner_list edge_list :
typedef typename fas::merge< center, typename fas::merge< typename fas::random_shuffle< R, corner_list>::type, typename fas::random_shuffle< R, side_list>::type >::type >::type level2_list;
: , , . fas::merge ââ fas::type_list_n.
random_shuffle?, , , , . . , :
[A,B,C,D]
, , - , :
[10,2,44,7]
:
[[10,A],[2,B],[44,C],[7,D]]
:
[[2,B],[7,D],[10,A],[44,C]]
:
[B,D,A,C]
, . :
typedef fas::generator< fas::int_<1>, fas::inc< fas::_ > >::next_type result;
:
typedef fas::generator< fas::int_<1>, fas::rand< fas::_> >::next_type result;
fas::generate . fas::random_shuffle fas::shuffle, ( fas::transform2), , (fas::transform).
fas::random_shuffle, fas::shuffle â . fas::random_shuffle:
template<typename R, typename L> struct random_shuffle { typedef typename generate_c< length<L>::value, generator_t<rand<R>, rand > >::type rand_list; typedef typename shuffle< L, rand_list>::type type; };
fas::shuffle:
template<typename L, typename RL> struct shuffle { typedef typename transform2_t< RL, L, make_pair >::type pair_list; typedef typename sort< pair_list, less< first<_1>, first<_2> > >::type sorted_list; typedef typename transform_t< sorted_list, second >::type type; };
, :
typedef typename fas::random_shuffle< R, level2_list >::type level0_list;
, , :
typedef typename fas::merge< corner_list, edge_list >::type side_list; typedef typename fas::merge< center, typename fas::random_shuffle< R, side_list>::type >::type level1_list;
, , :
typedef typename fas::switch_< fas::case_c< Level::value == 0, level0_list >, fas::case_c< Level::value == 1, level1_list >, fas::default_< level2_list > >::type type;
:
template<typename R, typename Level> struct priority_positions { typedef fas::int_<4> center; typedef fas::type_list_n< fas::int_<0>, fas::int_<2>, fas::int_<6>, fas::int_<8> >::type corner_list; typedef fas::type_list_n< fas::int_<1>, fas::int_<3>, fas::int_<5>, fas::int_<7> >::type edge_list; typedef typename fas::merge< corner_list, edge_list >::type side_list; typedef typename fas::merge< center, typename fas::merge< typename fas::random_shuffle< R, corner_list>::type, typename fas::random_shuffle< R, side_list>::type >::type >::type level2_list; typedef typename fas::merge< center, typename fas::random_shuffle< R, side_list>::type >::type level1_list; typedef typename fas::random_shuffle< R, level2_list >::type level0_list; typedef typename fas::switch_< fas::case_c< Level::value == 0, level0_list >, fas::case_c< Level::value == 1, level1_list >, fas::default_< level2_list > >::type type; };
priority_positions â . free_moves , [N,e], :
typedef typename fas::transform < typename priority_positions< R, Level >::type, fas::pair< fas::_1, fas::type_at< fas::_1, Board> > >::type pair_list;
:
typedef typename fas::select< pair_list, fas::same_type< e, fas::second<fas::_> > >::type type;
, , :
template<typename R, typename Level, typename Board> struct free_moves { typedef typename fas::transform< typename priority_positions< R, Level >::type, fas::pair< fas::_1, fas::type_at< fas::_1, Board> > >::type pair_list; typedef typename fas::select< pair_list, fas::same_type< e, fas::second<fas::_> > >::type type; };
game â . , e, , . ( , ):
template<typename Pos, typename Fig, typename Board> struct do_move { typedef typename set_at< Pos, Fig, Board >::type type; }; template<typename Fig, typename Board> struct do_move< fas::int_<-1>, Fig, Board> { typedef fas::empty_list type; };
. , . :
#include "tictactoe.hpp" #include "types.hpp" #include "show_board.hpp" #include <iostream> int main() { typedef game< initial_rand, level, board >::type result; std::cout << result() ; return 0; }
, . , â .
-.
, game, , . . ( ):
int factorial(int n) { return n > 0 ? n * factorial(n - 1) : 1; }
:
template<int N> struct factorial { enum { value = N * factorial<N-1>::value }; }; template<> struct factorial<1> { enum { value = 1 };};
:
int factorial(int i) { int result = 1; for ( ; i > 0; result*=i, --i); return result; }
:
int i=0; for (; i<10;i++); std::cout << i << std::endl;
fas::for_:
typedef fas::for_< fas::int_<0>, fas::less<fas::_, fas::int_<10> >, fas::inc<fas::_> >::type result; std::cout << result::value << std::endl;
for fas::for_ : , . , , , , , . , , , .. . , . , .
â :
template<int I> struct factorial { typedef typename fas::for_<
, ( ). , game . fas::for_ . , , fas::int_<-1>, . , :
fas::type_list< fas::tuple< fas::empty_type,
, , , . , , â .
, , fas::int_<-1> ( ) , e ( ):
fas::and_< fas::not_< fas::same_type< fas::int_<-1>, fas::first< last< fas::_1> > > >, fas::same_type< e, fas::second< last< fas::_1> > > >
:
fas::push_back< game< initial_rand,
, ( << ):
#include "show_board.hpp" #include "tictactoe.hpp" #include "types.hpp" int main() { typedef fas::for_< fas::type_list< fas::tuple< fas::empty_type, e, board > >, fas::and_< fas::not_< fas::same_type< fas::int_<-1>, fas::first< last< fas::_1> > > >, fas::same_type< e, fas::second< last< fas::_1> > > >, fas::push_back< game< initial_rand, level, fas::third< last< fas::_1> > >, fas::_1 > >::type result_list; typedef fas::tail<result_list>::type game_list; std::cout << board() << std::endl; std::cout << game_list() << std::endl; return 0; }
ãããã«
-, , . ( ), . , , . , .
, . - â , fas::for_ . -, - - ( - ).
- . XP. , ( ), . . , , ( , ),
error: template instantiation depth exceeds maximum of 900
, , , . , (, ), ( ) Internal Compiler Error. , fas::for_, -, board , , fas::empty_type, 128 ( gcc-4.8).
, fas::type_list_n . fas/aop ( - ), 8 . , , , , .