рд╣реЗрд▓реЛ рд╣рдмреНрд░!
рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рдХрдИ рджреА рдЧрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдпрд╣ рдЪрд╛рд░ [] рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддрд╛рдХрд┐ рджрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдЗрд╕рдореЗрдВ рдлрд┐рдЯ рд╣реЛред рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХреЛрдИ рдЧрдгрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк std :: auto_ptr рдпрд╛ std :: string рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдЪрд╛рд░ [] рдмрдлрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ POD рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдЙрдмрд▓рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ, рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ c ++ 03 рдФрд░ c ++ 11 рдорд╛рдирдХ рдореЗрдВред рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрддреЗ рд╕рдордп, рдореБрдЭреЗ рджреЛ рд▓реЗрдЦ рдорд┐рд▓реЗ рдЬрд┐рдирд╕реЗ рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА:
habrahabr.ru/post/166201 ,
habrahabr.ru/post/38622 ред
рдЗрд╕рд▓рд┐рдП, рд╕рднреА рджреА рдЧрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
const char str1[] = "Anna"; const char str2[] = "Denis"; const char str3[] = "Vladimir"; const char str4[] = "Alexey"; const char *arr[] = { str1, str2, str3, str4 };
рдЕрдм, рдЖрдХрд╛рд░ (рдЧрд┐рд░рдлреНрддрд╛рд░реА) 16 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА, рдФрд░ рдЖрдХрд╛рд░ (рдЧрд┐рд░рдлреНрддрд╛рд░реА [2]) рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред 4. рдЕрдлрд╕реЛрд╕, рд╣рдордиреЗ рдЧрд┐рд░рдлреНрддрд╛рд░реА рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рджреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЪрд╛рд▓ рдпрд╛ рддреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░, рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдбреЗрд░реЗрдлрд╝рд░рд┐рдВрдЧ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ...
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рдгреА рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реИред рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЛрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдВрдзреЗрдВ :: рдЯрд╛рдЗрдкрд┐рд╕реНрдЯред
struct str_1 { static const int size = sizeof(str1); }; struct str_2 { static const int size = sizeof(str2); }; struct str_3 { static const int size = sizeof(str3); }; struct str_4 { static const int size = sizeof(str4); }; typedef LOKI_TYPELIST_4(str_1, str_2, str_3, str_4) List;
рдЕрдм рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪреА рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрддрд┐рдо C ++ 03 struct str_1 { static const int size = sizeof(str1); }; struct str_2 { static const int size = sizeof(str2); }; struct str_3 { static const int size = sizeof(str3); }; struct str_4 { static const int size = sizeof(str4); }; typedef LOKI_TYPELIST_4(str_1, str_2, str_3, str_4) List; #define GetMaxLen(TypeList) \ \ template<class Cur_Type> \ struct len \ { \ static const int cur_size = Cur_Type::Head::size; \ static const int next_size = len<Cur_Type::Tail>::max_size; \ static const int max_size = cur_size > next_size ? cur_size : next_size ; \ }; \ \ template<> \ struct len<NullType> \ { \ static const int max_size = 0; \ }; \ \ static const int ml = len<TypeList>::max_size; \ GetMaxLen(List); // *.cpp // LOKI_STATIC_CHECK((ml == sizeof(str3)), size_is_wrong);
рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд░рд╛рд╢рд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред
C ++ 11 рдорд╛рдирдХ рдкрд░, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рдХрд▓рд╛ред рд╕рд╛рде рд╣реА, рдЖрдкрдХреЛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде "рдмрд┐рдЧрд╛рдбрд╝рдиреЗ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдбрд┐рдлрд░реЗрдВрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрдк рдФрд░ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрджрд░ред
рдлрд╛рдЗрдирд▓ рд╕реА ++ 11 constexpr const char str1[] = "Anna"; constexpr const char str2[] = "Denis"; constexpr const char str3[] = "Vladimir"; constexpr const char str4[] = "Alexey"; constexpr const char *arr[] = { str1, str2, str3, str4 }; #define GetMaxLenght(array) \ constexpr unsigned char str_len(const char* const str) \ {\ return *str ? (1 + str_len(str + 1)) : 0;\ }\ \ template <int index> \ struct MaxLenght\ {\ static const int prev_size = MaxLenght<index-1>::max_size;\ static const int cur_size = str_len(array[index]);\ static const int max_size = cur_size > prev_size ? cur_size : prev_size;\ };\ \ template <>\ struct MaxLenght<-1>\ {\ static const int max_size = 0;\ };\ static const int AmountStr = sizeof(array) / sizeof(array[0]);\ static const int array##_max_size = MaxLenght<AmountStr-1>::max_size; GetMaxLenght(arr); // *.cpp // static_assert((arr_max_size == 8), "Error");
PS рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдкреАрдкреАрдПрд╕ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рдмреВрд╕реНрдЯ рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред