Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. template <typename R, typename... T>
  5. struct is_one_of {
  6.   static constexpr bool value = false;
  7. };
  8.  
  9. template <typename R, typename F, typename S, typename... T>
  10. struct is_one_of<R, F, S, T...>
  11.   : public std::conditional <std::is_same<F, S>::value || is_one_of<F, T...>::value, R, std::false_type >
  12. {
  13.   static constexpr bool value =
  14.     std::is_same<F, S>::value || is_one_of<F, T...>::value;
  15. };
  16.  
  17. template < typename ...Types> struct type_list {};
  18.  
  19. template <typename T>
  20. struct message
  21. {
  22.   T payload;
  23. };
  24.  
  25. struct is_ll_payload {};
  26. struct is_ss_payload {};
  27.  
  28. struct payload_ll_1{};
  29. struct payload_ll_2{};
  30. using ll_payload_list = type_list< payload_ll_1, payload_ll_2 >;
  31.  
  32. struct payload_ss_1{};
  33. struct payload_ss_2{};
  34. using ss_payload_list = type_list < payload_ss_1, payload_ss_2 >;
  35.  
  36.  
  37. struct A {
  38.   template < typename T>
  39.   void f_generic( const message<T>& msg, std::false_type )
  40.   {
  41.     std::cout << "false type\n";
  42.   }
  43.  
  44.   template < typename T>
  45.   void f_generic( const message<T>& msg, is_ll_payload )
  46.   {
  47.     std::cout << "ll payload\n";
  48.   }
  49.  
  50.   template < typename T>
  51.   void f_generic( const message<T>& msg, is_ss_payload )
  52.   {
  53.     std::cout << "ss payload\n";
  54.   }
  55.  
  56.   template < typename T >
  57.   void f( const message<T>& msg )
  58.   {
  59.     std::cout << "f\n";
  60.  
  61.     f_generic( msg, typename is_one_of< is_ll_payload, T, ll_payload_list >::type() );
  62.     f_generic( msg, typename is_one_of< is_ss_payload, T, payload_ss_1, payload_ss_2 >::type() );
  63.   }
  64. };
  65.  
  66. int main()
  67. {
  68.   std::cout << "start\n";
  69.  
  70.   A a;
  71.  
  72.   message<payload_ll_1> msg_ll;
  73.   message<payload_ss_1> msg_ss;
  74.  
  75.   a.f( msg_ll );
  76.   a.f( msg_ss );
  77.  
  78.   return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement