Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template<typename G, typename M>
- struct DoMove {
- private:
- constexpr static bool _isRLMove = (M::direction == Direction::LEFT
- || M::direction == Direction::RIGHT);
- public:
- using result = typename Conditional<
- _isRLMove, DoMoveRL<G, M>, DoMoveUD<G, M>>::value::result;
- };
- template<bool C, template<typename ...> class...>
- struct Conditional {
- };
- template<template<typename...> class C1, template<typename...> class C2>
- struct Conditional<true, C1, C2> {
- template<typename... Ts>
- using apply = typename C1<Ts...>;
- };
- template<template<typename...> class C1, template<typename...> class C2>
- struct Conditional<false, C1, C2> {
- template<typename... Ts>
- using apply = typename C1<Ts...>;
- };
- using result = typename Conditional<_isRLMove, DoMoveRL, DoMoveUD>::template apply<G, M>::result;
- template<typename T> struct type { using type = T; };
- auto choose_type() {
- if constexpr (_isRLMove) {
- return type<typename DoMoveRL<G, M>::result>{};
- } else {
- return type<typename DoMoveUD<G, M>::result>{};
- }
- }
- using result = decltype(choose_type())::type;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement