рдПрдХ рд╕рдореНрдорд╛рдирд┐рдд
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);
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд╣рдо рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реЗрд╖ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЙрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╣рддреЗ рд╣реИрдВред
рд╕реЗрдЯ / рддрд░реАрдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдЕрдЧрд▓рд╛ рдХрджрдо рд╡рд░реНрдЧ рдХреЗ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕рдиреЗ рдФрд░ рдкрд╛рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЬреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рд╡реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдБ рдирд╣реАрдВ рджреА рдЧрдИ рд╣реИрдВред рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ рдХрд┐, рдПрдХ рдЧреЗрдЯрд░ рдХреЗ рд╕рд╛рде, рдЬреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рд░рд╛рд╕рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ
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;
рд╕реЗрдЯрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдЯрдкрд▓ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рдПрдХ рдкреВрд░реНрдг рдЪрд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?), рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред
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>)
рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рд╣рдо рд╕реАрдзреЗ
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