рд╕реА ++ рдореЗрдВ рдЯреБрдкрд▓реНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рдПрдХ рд╕рдореНрдорд╛рдирд┐рдд FlexFerrum рджреНрд╡рд╛рд░рд╛ Variadic Templates рдкрд░ рдПрдХ рдорд╣рд╛рди рд▓реЗрдЦ рдкрдврд╝рдиреЗ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ Tuple рдирд╛рдордХ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдПрдХ рдЯреНрдпреВрдкрд▓ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рд╣реЛрдЧрд╛ рдЬреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ (рдСрд░реНрдбрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП)ред

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд░реЛрдХреНрдд рд▓реЗрдЦ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЬрдм рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрд╕ рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░реВрдВрдЧрд╛ред

рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг

рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИред FlexFerrum рдХреЗ рд▓реЗрдЦ рдореЗрдВ, рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реБрдкрд░рдкреЛрдЬрд┐рд╢рди рд╣реИред рдлрдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, DataHolder рдХреНрд▓рд╛рд╕ рд╕реЗ рдХрдИ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХрд╛ рдореЙрдбрд▓ DataHolder рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛:

 template<typename T> struct DataHolder { T m_data; }; template<typename Op, typename тАж F> class Composer : public DataHolder<F> тАж { // ... }; 


рд╣рдо рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИрдВред

 template <class T, class ... REST> class Tuple : public Tuple<REST ...> { public: Tuple(); Tuple(const T & _p1, const REST & ... _rest); /// returns elements count inline constexpr static unsigned int Count() { return mIndex + 1; } // ... protected: private: T mMember = T(); static constexpr unsigned int mIndex = TupleSuper::Count(); } //   template <class T> class Tuple { public: Tuple(); Tuple(const T & _p1); /// returns elements count inline constexpr static unsigned int Count() { return mIndex + 1; } // ... protected: private: T mMember = T(); static constexpr unsigned int mIndex = 0; } 


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд╣рдо рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реЗрд╖ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЙрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╣рддреЗ рд╣реИрдВред

рд╕реЗрдЯ / рддрд░реАрдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдЕрдЧрд▓рд╛ рдХрджрдо рд╡рд░реНрдЧ рдХреЗ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕рдиреЗ рдФрд░ рдкрд╛рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЬреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рд╡реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдБ рдирд╣реАрдВ рджреА рдЧрдИ рд╣реИрдВред рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ рдХрд┐, рдПрдХ рдЧреЗрдЯрд░ рдХреЗ рд╕рд╛рде, рдЬреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рд░рд╛рд╕рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ Tuple рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рд╕реВрдЪрдХрд╛рдВрдХ 0 рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕рдмрд╕реЗ рдХрдо рд╡рдВрд╢рдЬ рд╣реИ, рд╕реВрдЪрдХрд╛рдВрдХ 1 рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рддрддреНрдХрд╛рд▓ рдкреВрд░реНрд╡рдЬ, рдЖрджрд┐ред рдкреНрд░реЗрд░рдг рджреНрд╡рд╛рд░рд╛ред рдмрд╣реБрдд рд╕реЗ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрдВрдбреЗрдХреНрд╕ 0 рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдиреЗрд╢рди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдПрди рдХреЗ рд╕рд╛рде рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдПрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдХрдХреНрд╖рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - 1. рд╣рдо рдЕрдкрдиреЗ "рдЗрдВрдбреЗрдХреНрд╕рд░" рдХреЗ рдЕрдВрджрд░ tuple рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡рдпрдВ (рдпрд╛ typedef ) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рд╡рд░реНрдЧ рдХреЛ рд╕рд╛рджреЗ TupleIndexer ред

 template <class T, class ... REST> class Tuple; template <unsigned int INDEX, class T, class ... REST> class TupleIndexer { public: using TupleIndexerDeeper = TupleIndexer<INDEX - 1, REST ...>; using TupleType = typename TupleIndexerDeeper::TupleType; }; template <class T, class ... REST> class TupleIndexer<0, T, REST ...> { public: using TupleType = Tuple<T, REST ...>; }; 


рдЖрдЧреЗ рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдордиреЗ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рд╣реИред рд╣рдо рд╡рд░реНрддрдорд╛рди Tuple рдХреНрд▓рд╛рд╕ рдХреЛ static_cast рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ Tuple рдкрд░рд┐рдХрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗред Get рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╛рдИрдВ рдУрд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ Tuple рдореЗрдВ рдПрдХ рд╕рдорд╛рдирд╛рд░реНрдереА рд╢рдмреНрдж Tuple рдФрд░ рд╣рдо рдЗрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд Tuple рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

 template <class T, class ... REST> class Tuple : public Tuple<REST ...> { public: using LeftMemberType = T; template <unsigned int INDEX> using MemberTypeIndexed = typename tuple::TupleIndexer<INDEX, T, REST ...>::TupleType::LeftMemberType; template <unsigned int INDEX> using TupleTypeIndexed = typename tuple::TupleIndexer<INDEX, T, REST ...>::TupleType; template <unsigned int INDEX> inline const MemberTypeIndexed<INDEX> & Get() const; // ... }; template <class T, class ... REST> template <unsigned int INDEX> inline const typename Tuple<T, REST ...>::template MemberTypeIndexed<INDEX> & Tuple<T, REST ...>::Get() const { return static_cast<const TupleTypeIndexed<INDEX> *>(this)->mMember; } 


рд╕реЗрдЯрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдЯрдкрд▓ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рдПрдХ рдкреВрд░реНрдг рдЪрд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?), рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред

SubTuple

рдЕрдЧрд▓рд╛ рдХрджрдо рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд╡рд╣ рджреВрд╕рд░реЗ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди рд╕реЗ рдПрдХ рдЯрдкрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЦреЗрддреЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирдП Tuple рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 template <class T, class ... REST> class Tuple : public Tuple<REST ...> { public: using LeftMemberType = T; template <unsigned int INDEX> using MemberTypeIndexed = typename tuple::TupleIndexer<INDEX, T, REST ...>::TupleType::LeftMemberType; template <unsigned int ... INDICES> using SubTupleTypeIndexed = Tuple<MemberTypeIndexed<INDICES> ...>; template <unsigned int ... INDICES> inline SubTupleTypeIndexed<INDICES ...> MakeTuple() const { return Tuple<MemberTypeIndexed<INDICES> ...>(Get<INDICES>() ...); } // ... }; 


рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╣рдо рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдПрдХ рд╕реАрдорд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рджрд┐рдП рдЧрдП рд╕реАрдорд╛ рд╕реЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдХ Tuple рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН:

 template <unsigned int A, unsigned int B> inline SubTupleTypeRanged<A, B> MakeSubTuple() const; 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рдФрд░ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП Tuple рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рди рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо FlexFerrum рдХреЗ рд▓реЗрдЦ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди рдПрдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕реАрдорд╛ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ (рдП рдФрд░ рдмреА) рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рдХреЗ рдкрд░реНрдпрд╛рдп рдХреЛ рдП рд╕реЗ рдмреА рддрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╡рд╣ рд╡рд░реНрдЧ, рдмрджрд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП Tuple рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреНрд░рдорд╢рдГ Range рдФрд░ Indices рдЪрдпрди рдХрд░реЗрдВрдЧреЗред

Tuple рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреЛ Tuple рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ Tuple рдХрд░рддрд╛ рд╣реИ:

 template <class T, class ... REST> class Tuple; template <unsigned int ... INDICES> class Indices { public: template <class T, class ... REST> using SubTupleType = Tuple<typename Tuple<T, REST ...>::template MemberTypeIndexed<INDICES> ...>; protected: private: }; 


рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдорд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 template <unsigned int A, unsigned int B> class Range { public: using RangeLesser = Range<A, B + (A < B ? - 1 : 1)>; template <unsigned int ... INDICES> using IndicesExtendable = typename RangeLesser::template IndicesExtendable<B, INDICES ...>; using Indices = IndicesExtendable<>; protected: private: }; template <unsigned int INDEX> class Range<INDEX, INDEX> { public: template <unsigned int ... INDICES> using IndicesExtendable = tuple::Indices<INDEX, INDICES ...>; using Indices = IndicesExtendable<>; protected: private: }; 


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╢рд╛рдЦрд╛ рд╕рдорд╛рди рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд (рд▓рдВрдмрд╛рдИ = 0) рдХреЗ рд╕рд╛рде рдПрдХ рд╕реАрдорд╛ рд╣реИред N рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реАрдорд╛ IndicesExtendable рдкреИрдЯрд░реНрди рдХреЛ N рд╕реЗ рдПрдХ рд╕реАрдорд╛ рд╕реЗ IndicesExtendable рдкреИрдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ - 1. рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдзреАрд░реЗ-рдзреАрд░реЗ рд░реЗрдВрдЬ рдХреЛ рдПрдХ рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рддрдХ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реИрдХреНрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░реЗрдВрдЬ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, IndicesExtendable рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рдХреЛ рдПрдХ рдирдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдХрд░ IndicesExtendable - рдкрд┐рдЫрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ Indicesxtxtable рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХред рдЗрд╕ рдкреНрд░рдХрд╛рд░ Range<1, 4> рдореЗрдВ Indices = Indices<1, 2, 3, 4> ред рдпрд╣ рд╢реНрд░реЗрдгреА рд╡рд░реНрдЧ рд╡рд┐рдкрд░реАрдд рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - Range<4, 1> ред рдЗрд╕рд╕реЗ Indices<4, 3, 2, 1> рдЯрд╛рдЗрдк рд╣реЛрдЧрд╛ред

рдПрдХ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдХрд┐ MakeSubTuple рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдк рдЗрд╕реЗ рдПрдХ рдЕрдиреНрдп MakeTuple рдкрджреНрдзрддрд┐ рд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Indices рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред

 template <unsigned int ... INDICES> inline SubTupleTypeIndexed<INDICES ...> MakeTuple(const Indices<INDICES ...> &) const; 


рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреЗрд╡рд▓ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рд╣рдо рдмрд┐рдирд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 t.MakeTuple(Indices<1, 2, 3>) //  ,   t.MakeTuple<1, 2, 3>() 


рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рд╣рдо рд╕реАрдзреЗ MakeSubTuple рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╡реЗ рдЗрдВрдбреЗрдХреНрд╕ рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рд░реЗрдВрдЬ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдкрд░ рдпрд╛ рд╕реНрдерд┐рд░ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ MakeTuple рдФрд░ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд MakeTuple

 template <class T, class ... REST> class Tuple : public Tuple<REST ...> { public: template <unsigned int A, unsigned int B> using SubTupleTypeRanged = typename Range<A, B>::Indices::template SubTupleType<T, REST ...>; template <unsigned int A, unsigned int B> inline SubTupleTypeRanged<A, B> MakeSubTuple() const { return MakeTuple(typename Range<A, B>::Indices()); } // ... }; 


рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдЕрднреА рднреА рдПрдХ рдЕрдиреНрдп MakeTuple рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ ( MakeTuple рдпрд╛ Range рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ, рдЕрдиреНрдпрдерд╛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐)ред рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреЗрд╣рддрд░ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ:

Tuple<char, int, double, float>::MakeTuple<Indices<3, 3>, Range<0, 1>, Indices<2>> Tuple<float, float, char, int, double> рдХреЛ рд▓реМрдЯрд╛ Tuple<float, float, char, int, double>

рджреЛ MakeTuple рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдЦрд╛рд▓реА рд╡рд░реНрдЧ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдирд╛ рдХрдо рд╕реЗ рдХрдо рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдмреЛрдирд╕

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ - Invoke ред рдпрд╣ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╣рдорд╛рд░реЗ Tuple рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Tuple рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рддрдВрддреНрд░ рдкрд╣рд▓реЗ Tuple рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд╢реБрд░реВ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реИред рдПрдХ BUT - рдлрд╝рдВрдХреНрд╢рди / рдлрд╝рдВрдХреНрдЯрд░ / рд▓реИрдореНрдмреНрдбрд╛ / рдЖрджрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЙрд╕реА рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ MakeSubTuple рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред

 template <class CALLABLE, unsigned int ... INDICES> inline void Invoke(CALLABLE & _function, const Indices<INDICES ...> &) { _function(Get<INDICES>()...); } template <class CALLABLE> inline void Invoke(CALLABLE & _function) { Invoke(_function, typename Range<0, mIndex>::Indices()); } 


рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ? рдФрд░ рдпрд╣ рддрдереНрдп рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ Tuple рд╡рд░реНрдЧ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд Bind рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рдХреЗ рдореВрд▓ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЙрдирдХреА рдкреВрд░реНрдгрддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рд╣реИ:

 template <class ... ARGS> class Bind { public: using Function = std::function<void (ARGS ...)>; using Tuple = tuple::Tuple<ARGS ...>; Bind(Function _function, const ARGS & ... _args): mFunction(_function), mTuple(_args ...) { } void operator() () { mTuple.Invoke(mFunction); } private: Function mFunction; Tuple mTuple; }; 


рдмреЗрд╢рдХ, рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ CALLABLE рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рд╕рд╛рд░рд╛рдВрд╢

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ Tuple рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рддрд░реАрдХреЗ рдХрд╛рдлреА рддреЗрдЬреА рд╕реЗ рдирд┐рдХрд▓реЗ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд░рдирдЯрд╛рдЗрдо рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Variadic Templates рдЖрдкрдХреЛ рдХреЛрдб рдХреА рдмрд╣реБрдд рд╕рдВрдХреБрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХ рдЯрдкрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ Tuple - Tuple. , , , . Get . Get . .

. Get<2> Tuple<int, char> , , Tuple . "" , , , static_assert .

Tuple , Tuple<char, double, member1, member2> , Get , . , .. C , . Tuple . , compile time , , Serialize . Tuple .

. Tuple<int, char, double> Tuple<char, double> Tuple. . Tuple , , , , , - , , .

Tuple github .

readme, .
- , , append , etc.
.

main.cpp , .

:
en.wikipedia.org/wiki/Variadic_template
habrahabr.ru/post/101430
рд╡рд░реНрдЧ Tuple - Tuple. , , , . Get . Get . .

. Get<2> Tuple<int, char> , , Tuple . "" , , , static_assert .

Tuple , Tuple<char, double, member1, member2> , Get , . , .. C , . Tuple . , compile time , , Serialize . Tuple .

. Tuple<int, char, double> Tuple<char, double> Tuple. . Tuple , , , , , - , , .

Tuple github .

readme, .
- , , append , etc.
.

main.cpp , .

:
en.wikipedia.org/wiki/Variadic_template
habrahabr.ru/post/101430
рдХреА рд╕рдорд╛рдкреНрддрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ Tuple - Tuple. , , , . Get . Get . .

. Get<2> Tuple<int, char> , , Tuple . "" , , , static_assert .

Tuple , Tuple<char, double, member1, member2> , Get , . , .. C , . Tuple . , compile time , , Serialize . Tuple .

. Tuple<int, char, double> Tuple<char, double> Tuple. . Tuple , , , , , - , , .

Tuple github .

readme, .
- , , append , etc.
.

main.cpp , .

:
en.wikipedia.org/wiki/Variadic_template
habrahabr.ru/post/101430
Tuple - Tuple. , , , . Get . Get . .

. Get<2> Tuple<int, char> , , Tuple . "" , , , static_assert .

Tuple , Tuple<char, double, member1, member2> , Get , . , .. C , . Tuple . , compile time , , Serialize . Tuple .

. Tuple<int, char, double> Tuple<char, double> Tuple. . Tuple , , , , , - , , .

Tuple github .

readme, .
- , , append , etc.
.

main.cpp , .

:
en.wikipedia.org/wiki/Variadic_template
habrahabr.ru/post/101430

Source: https://habr.com/ru/post/In179153/


All Articles