Информация об изменениях

Сообщение Re: Улучшение (?) от 29.03.2017 7:48

Изменено 29.03.2017 8:13 rg45

Re: Улучшение
Здравствуйте, rg45, Вы писали:

Улучшение состоит в том, что теперь не требуется процедуры создания счетчика как таковой — счетчиком с любым произвольным именем можно сразу брать и пользоваться при помощи макроса GET_CTC и наращивать при помощи UPDATE_CTC. По умолчанию все счетчики стартуют с нуля с шагом 1. Если нужно запустить счетчик от другой точки отсчета и/или с другим шагом, можно воспользоваться опциональным макросом RESET_CTC. Этим же макросом можно перезапустить счетчик, уже находившийся в использовании.

Хотя, серьезным недостатком это подхода является невозможность модификации счетчиков внутри классов. Да и при использовании в разных пространствах имен тоже все грустно. Надо, помозговать, возможно, придумается какой-нибудь компромисс.

http://ideone.com/HZQ6us

template <int ORIGIN = 0, int INCREMENT = 1>
struct $CTCOrigin : std::integral_constant<int, ORIGIN>
{
   static constexpr int increment = INCREMENT;
};
 
template <typename Tag, size_t LINE>
struct $CTC : $CTC<Tag, LINE - 1> { };
 
template <typename Tag>
struct $CTC<Tag, 0> : $CTCOrigin<0, 1> { };
 
#define RESET_CTC(Tag, ...)    template <> struct $CTC<class Tag, __LINE__> : $CTCOrigin<__VA_ARGS__> { };
 
#define UPDATE_CTC(Tag)    template <> struct $CTC<class Tag, __LINE__> : $CTC<class Tag, __LINE__ - 1>    {       static constexpr int value = $CTC<class Tag, __LINE__ - 1>::value + increment;    };
 
#define GET_CTC(Tag)    $CTC<class Tag, __LINE__ - 1>::value
Re: Улучшение (?)
Здравствуйте, rg45, Вы писали:

Улучшение состоит в том, что теперь не требуется процедуры создания счетчика как таковой — счетчиком с любым произвольным именем можно сразу брать и пользоваться при помощи макроса GET_CTC и наращивать при помощи UPDATE_CTC. По умолчанию все счетчики стартуют с нуля с шагом 1. Если нужно запустить счетчик от другой точки отсчета и/или с другим шагом, можно воспользоваться опциональным макросом RESET_CTC. Этим же макросом можно перезапустить счетчик, уже находившийся в использовании.

Хотя, серьезным недостатком это подхода является невозможность модификации счетчиков внутри классов. Да и при использовании в разных пространствах имен тоже все грустно. Надо, помозговать, возможно, придумается какой-нибудь компромисс.

http://ideone.com/HZQ6us

template <int ORIGIN = 0, int INCREMENT = 1>
struct $CTCOrigin : std::integral_constant<int, ORIGIN>
{
   static constexpr int increment = INCREMENT;
};
 
template <typename Tag, size_t LINE>
struct $CTC : $CTC<Tag, LINE - 1> { };
 
template <typename Tag>
struct $CTC<Tag, 0> : $CTCOrigin<0, 1> { };
 
#define RESET_CTC(Tag, ...) \
   template <> struct $CTC<class Tag, __LINE__> : $CTCOrigin<__VA_ARGS__> { };
 
#define UPDATE_CTC(Tag) \
   template <> struct $CTC<class Tag, __LINE__> : $CTC<class Tag, __LINE__ - 1> \
   { \
      static constexpr int value = $CTC<class Tag, __LINE__ - 1>::value + increment; \
   };
 
#define GET_CTC(Tag) \
   $CTC<class Tag, __LINE__ - 1>::value