Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <cassert>
  2. #include <type_traits>
  3. #include <iostream>
  4.  
  5. template <typename T, typename... Args>
  6. struct is_one_of;
  7.  
  8. template <typename T>
  9. struct is_one_of<T> {
  10.     static constexpr bool result = false;
  11. };
  12.  
  13. template <typename T, typename... Args>
  14. struct is_one_of<T, T, Args...> {
  15.     static constexpr bool result = true;
  16. };
  17.  
  18. template <typename T, typename K, typename... Args>
  19. struct is_one_of<T, K, Args...> {
  20.     static constexpr bool result = is_one_of<T, Args...>::result;
  21. };
  22.  
  23.  
  24.  
  25. template <typename... List> struct type_list {
  26. };
  27.  
  28.  
  29.  
  30. template <typename T, typename TypeList>
  31. struct is_one_of_type_list;
  32.  
  33. template <typename T, typename... Args>
  34. struct is_one_of_type_list<T, type_list<Args...>> {
  35.     static constexpr bool result = is_one_of<T, Args...>::result;
  36. };
  37.  
  38.  
  39.  
  40.  
  41. template <typename T>
  42. struct message
  43. {
  44.   T payload;
  45. };
  46.  
  47.  
  48. struct payload_ll_1{};
  49. struct payload_ll_2{};
  50. using ll_payload_list = type_list< payload_ll_1, payload_ll_2 >;
  51.  
  52. struct payload_ss_1{};
  53. struct payload_ss_2{};
  54. using ss_payload_list = type_list < payload_ss_1, payload_ss_2 >;
  55.  
  56.  
  57. template <typename T>
  58. void f( const message<T>& msg,
  59.         typename std::enable_if<is_one_of_type_list<T, ll_payload_list>::result>::type* = 0) {
  60.     std::cout << "I'm LL payload" << std::endl;
  61. }
  62.  
  63. template <typename T>
  64. void f( const message<T>& msg,
  65.         typename std::enable_if<is_one_of_type_list<T, ss_payload_list>::result>::type* = 0) {
  66.     std::cout << "I'm SS payload" << std::endl;
  67. }
  68.  
  69.  
  70. int main() {
  71.     assert(is_one_of<int>::result == false);
  72.     assert((is_one_of<int, int>::result == true));
  73.     assert((is_one_of<int, int, char, double>::result == true));
  74.     assert((is_one_of<int, char, int, double>::result == true));
  75.     assert((is_one_of<int, char, double>::result == false));
  76.  
  77.     using MyTypeList = type_list<int, char, double>;
  78.     assert((is_one_of_type_list<int, MyTypeList>::result == true));
  79.     assert((is_one_of_type_list<float, MyTypeList>::result == false));
  80.  
  81.  
  82.     message<payload_ll_1> ll_msg;
  83.     f( ll_msg );
  84.  
  85.     message<payload_ss_1> ss_msg;
  86.     f( ss_msg );
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement