Advertisement
Guest User

Untitled

a guest
Sep 27th, 2014
362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. // First of all we need something what can give us type of Nth element:
  5. template <size_t Pos, class T, class... TElements>
  6. struct TGetTypeOfNthElement {
  7.     using TResult = typename TGetTypeOfNthElement<Pos - 1, TElements...>::TResult;
  8. };
  9. template <class T, class... TElements> // If Pos == 0
  10. struct TGetTypeOfNthElement<0, T, TElements...> {
  11.     using TResult = T;
  12. };
  13.  
  14.  
  15.  
  16. // Now, when we can get type by its position, we can write function which returns value by position:
  17. // We are using SFINAE here, because we can not just write it
  18. // typename TGetTypeOfNthElement<Pos, T, TElements...>::TResult GetNthElement(T t, TElements... Elements) {
  19. //     if(Pos == 0) return t;
  20. //     else return GetNthElement<Pos - 1>(Elements...);
  21. // }
  22. // because compiler will try to instantiate this frunction with Pos == 0 and get GetNthElement<0 - 1> and will fail
  23. template<size_t Pos, class T, class... TElements, class = typename std::enable_if<Pos == 0>::type>
  24. T GetNthElement(T t, TElements... /*Elements*/) {
  25.     return t;
  26. }
  27. template<size_t Pos, class T, class... TElements, class = typename std::enable_if<Pos != 0>::type>
  28. typename TGetTypeOfNthElement<Pos, T, TElements...>::TResult GetNthElement(T t, TElements... Elements) {
  29.     //UNUSED(t);
  30.     return GetNthElement<Pos - 1>(Elements...);
  31. }
  32.  
  33.  
  34. // Finally we need to generate sequence of indeces, to pick up values in needed order.
  35. // In particular for this example
  36. // LetsStart<int, -1, 10, 3>("This is -1", "And this is 10", "3!!!");
  37. // following code will generate TSequence<0, 3, 1, 4, 2, 5>
  38. template<size_t ...Positions>
  39. class TSequence {};
  40. template <size_t MaxN, size_t i, size_t... AlreadyGeneratedNumbers>
  41. struct TGenerateSequence {
  42.     using TResult = typename TGenerateSequence<MaxN, i + 1, AlreadyGeneratedNumbers..., i, i + MaxN>::TResult;
  43. };
  44. template <size_t MaxN, size_t... AlreadyGeneratedNumbers>
  45. struct TGenerateSequence<MaxN, MaxN, AlreadyGeneratedNumbers...> {
  46.     using TResult = TSequence<AlreadyGeneratedNumbers...>;
  47. };
  48.  
  49.  
  50.  
  51. // Functions which will split values by two onces from pack and output it
  52. template<class TV, class TD>
  53. void Output(TV V, TD D) {
  54.     std::cout << V << " " << D << std::endl;
  55. }
  56. template<class TV, class TD, class ...TOther>
  57. void Output(TV V, TD D, TOther... Other) {
  58.     Output(V, D);
  59.     Output(Other...);
  60. }
  61.  
  62.  
  63. // Main entry point
  64. template<size_t... Indeces, class ...TElements>
  65. void LetsStart2(TSequence<Indeces...>, TElements... Elements) {
  66.     Output(GetNthElement<Indeces>(Elements...)...);
  67. }
  68. template<class TV, TV ...TVs, class ...TD>
  69. void LetsStart(TD...Ds) {
  70.     LetsStart2(typename TGenerateSequence<sizeof...(TVs), 0>::TResult(), TVs..., Ds...);
  71. }
  72.  
  73.  
  74. int main() {
  75.     LetsStart<int, -1, 10, 3>("This is -1", "And this is 10", "3!!!");
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement