рд╕рднреА рдХреЛ рд╢реБрдн рджрд┐рдиред
рдпрд╣ C ++ рдореЗрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рд╕реНрдЯреНрд░реИрд╕рдкреБрдк рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рддрд╣рдд рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдФрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред
рдореБрдЭреЗ рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рд▓рдЧрд╛ рдерд╛ рдХрд┐ рдЧреИрд░-рдорд╛рдирдХ C ++ рдлрд╝рдВрдХреНрд╢рди / рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯ рд╣реИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
void fn(VectorWrapper<int> x) { for (size_t i = 0; i < x.size(); ++i) { doSomething(x[i]); } } ::std::vector<int> sv; QList<int> qv; OtherSuperVector<int> ov; fn(sv); fn(qv); fn(ov);
рдФрд░ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдкрдврд╝реЗрдВред
рдореИрдВрдиреЗ рдЬреЛ рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛, рд╡рд╣ рдПрдХ рд╡реЗрдХреНрдЯрд░рд╡реЙрдкрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рддрд░реНрдХ (рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░) рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕реА рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯ рд╣реЛред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпреЗ рдСрдкрд░реЗрдЯрд░ [] рдФрд░ рдЖрдХрд╛рд░ () рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖ рдЬреЛ C ++ 11 рдорд╛рдирдХ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
template <typename T> class VectorWrapper { public: template <typename C> VectorWrapper(C& container) : _getter([&container](size_t i) -> T& { return container[i]; }), _sizeGetter([&container]() -> size_t { return container.size(); }) { } T& operator[](size_t i) { return _getter(i); } size_t size() { return _sizeGetter(); } private: ::std::function<T&(size_t) > _getter; ::std::function<size_t() > _sizeGetter; };
рдирддреАрдЬрддрди, рдЬрдм рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рд▓реИрдореНрдмреНрдбрд╛ рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЗ рдХреЗрд╡рд▓ рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЧрдП рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред
рдЕрдм, рдЗрд╕ рдЖрд╡рд░рдг рдореЗрдВ, рдЖрдк рдЖрдХрд╛рд░ () рдФрд░ рдСрдкрд░реЗрдЯрд░ [] рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдХрд╣реАрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рд▓реА рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдпрд╣ рд╕рдм рдЕрдкрдорд╛рди рдХрд░рддрд╛ред рдпрд╣ рднреА рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╣рд░ рдЬрдЧрд╣ рдРрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдареАрдХ рд╣реИ, рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рдлреЗрд░реАрд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд▓реИрдВрдмрдбрд╛рд╕ рдФрд░ рд╕реА ++ 11 рдХреА рдорджрдж рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?