Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2014
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <tuple>
  3. #include <type_traits>
  4.  
  5. #ifndef LOG_TYPE
  6. #define LOG_TYPE(X) std::clog << typeid(X).name() << std::endl;
  7. #endif
  8.  
  9. #ifndef LOG
  10. #define LOG(X) std::clog << X << std::endl;
  11. #endif
  12.  
  13. template <typename ... Parameters>
  14. void pass(Parameters&& ... parameters) {
  15. auto tuple = std::forward_as_tuple(parameters ...);
  16.  
  17. // std::tuple<int (&) [3]>
  18. LOG_TYPE(tuple);
  19.  
  20. typedef typename std::tuple_element<0, decltype(tuple)>::type array_type;
  21.  
  22. // int [3]
  23. LOG_TYPE(array_type);
  24.  
  25. // --- The following is not the desired result ---
  26. // array: 0
  27. LOG("array: " << std::is_array<array_type>());
  28. }
  29.  
  30.  
  31. template <typename ... Parameters>
  32. void pass_ref(Parameters&& ... parameters) {
  33. auto tuple = std::forward_as_tuple(parameters ...);
  34.  
  35. // std::tuple<std::reference_wrapper<int [3]>&>
  36. LOG_TYPE(tuple);
  37.  
  38. typedef typename std::remove_reference<
  39. typename std::tuple_element<0, decltype(tuple)>::type>::type
  40. element_type;
  41. typedef typename element_type::type array_type;
  42.  
  43. // int [3]
  44. LOG_TYPE(array_type);
  45.  
  46. // array: 1
  47. LOG("array: " << std::is_array<array_type>());
  48. }
  49.  
  50.  
  51. int main() {
  52. int array[3];
  53.  
  54. // array: 1
  55. LOG("array: " << std::is_array<decltype(array)>());
  56.  
  57. // This is what I like:
  58. pass(array);
  59. // This works:
  60. pass_ref(std::ref(array));
  61. return 0;
  62. }
  63.  
  64. template <typename ... Parameters>
  65. void pass(Parameters& ... parameters) {
  66. ^^^ no &&
  67.  
  68. typedef std::tuple<Parameters...> tuple_type;
  69. LOG_TYPE(tuple);
  70.  
  71. typedef typename std::tuple_element<0, tuple_type>::type array_type;
  72.  
  73. // int [3]
  74. LOG_TYPE(array_type);
  75.  
  76. // array: 0
  77. LOG("array: " << std::is_array<array_type>());
  78. }
  79.  
  80. template <typename ... Parameters>
  81. void pass(Parameters&& ... parameters) {
  82. auto tuple = std::forward_as_tuple(parameters ...);
  83.  
  84. // std::tuple<int (&) [3]>
  85. LOG_TYPE(tuple);
  86.  
  87. typedef typename std::tuple_element<0, decltype(tuple)>::type array_type_r;
  88.  
  89. // >>> drop the reference added by forward_as_tuple
  90. typedef typename std::remove_reference<array_type_r>::type array_type;
  91.  
  92. // int [3]
  93. LOG_TYPE(array_type);
  94.  
  95. // array: 0
  96. LOG("array: " << std::is_array<array_type>());
  97. }
  98.  
  99. #define LOG_TYPE(X) std::clog << typeid(X).name() << std::endl;
  100.  
  101. struct{}_ = foo; // where foo is a value of the type I want in the message
  102.  
  103. typedef typename std::remove_reference<
  104. typename std::tuple_element<0, decltype(tuple)>::type>::type array_type;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement