Advertisement
Guest User

C++ Appending parameter packs

a guest
Aug 7th, 2021
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3. #include <tuple>
  4. #include <type_traits>
  5.  
  6. template <typename ...Args>
  7. class PackClass
  8. {
  9. protected:
  10.     using Tuple = std::tuple<Args...>;
  11. private:
  12.     Tuple m_values;
  13. protected:
  14.     template <size_t I = 0, typename... Ts>
  15.     typename std::enable_if<I == sizeof...(Ts), void>::type
  16.     walkValues(std::tuple<Ts...> tuple)
  17.     {
  18.     }
  19.  
  20.     template <size_t I = 0, typename... Ts>
  21.     typename std::enable_if<(I < sizeof...(Ts)), void>::type
  22.     walkValues(std::tuple<Ts...> tuple)
  23.     {
  24.         auto value = std::get<I>(tuple);
  25.  
  26.         /* SOME ACTION */
  27.         std::cout << value << std::endl;
  28.  
  29.         walkValues<I + 1>(tuple);
  30.     }
  31.  
  32. public:
  33.     PackClass(Args... values) :
  34.         m_values(values...)
  35.     {
  36.     }
  37.  
  38.     template <typename Arg>
  39.     PackClass<Args..., Arg> Append(Arg value)
  40.     {
  41.         return std::make_from_tuple<PackClass<Args..., Arg>>(
  42.             std::tuple_cat(
  43.                 m_values,
  44.                 std::make_tuple(value)
  45.             )
  46.         );
  47.     }
  48.  
  49.     size_t Count() const
  50.     {
  51.         return std::tuple_size<Tuple>{};
  52.     }
  53.  
  54.     auto Fetch()
  55.     {
  56.         return walkValues(m_values);
  57.     }
  58. };
  59.  
  60. int main()
  61. {
  62.     PackClass{ 3, std::string("TestString"), 'c' }
  63.         .Append(3.5)
  64.         .Append("XYZ")
  65.         .Fetch();
  66.     /*auto result = */;
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement