Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Метапрограммирование, счетчик... 
:(
    Опции темы
SABROG
  Дата 14.4.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Объявляю перечисление флагов таким образом

Код

    enum MyModeFlag {
        NoOptions = 0,
        Option1 =   1L << 0,
        Option2 =   1L << 1,
        Option3 =   1L << 2,
        Option4 =   1L << 3,
        Option5 =   1L << 4
    };


что эквивалентно такому коду:

Код

    enum MyModeFlag {
        NoOptions = 0,
        Option1 = 1,
        Option2 = 2,
        Option3 = 4,
        Option4 = 8,
        Option5 = 16
    }


Хочу заставить препроцессор генерить циферки автоматом за меня, предположим через шаблоны:

Код

    enum MyModeFlag {
        NoOptions = Flag<>::value,
        Option1 =   Flag<>::value,
        Option2 =   Flag<>::value,
        Option3 =   Flag<>::value,
        Option4 =   Flag<>::value,
        Option5 =   Flag<>::value
    };


В шаблоне нужно каким-то образом сделать общий счетчик, который бы увеличивался на 1 при каждом вызове "Flag<>::value", при этом не хочется заводить переменной, которая бы занимала память. Каким образом это можно сделать?

Это сообщение отредактировал(а) SABROG - 14.4.2010, 18:54


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 14.4.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



SABROG

А так?
Код

template <int T>
struct Flag
{
    enum { value = (1L << T) };
};

enum MyModeFlag
{
    NoOptions = Flag<0>::value,
    Option1 =   Flag<1>::value,
    Option2 =   Flag<2>::value,
    Option3 =   Flag<3>::value,
    Option4 =   Flag<4>::value,
    Option5 =   Flag<5>::value
};


но по моему не наглядно это как-то.
PM   Вверх
17dufa
Дата 14.4.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



SABROG, немного не эквивалентноsmile с 0 или 1 начинается.
присоединяюсь к вопросу - мона такое?
*есть у мя подозрение, что низя.

azesmcar, я так понимаю топикастер не хочет в ручную считать 1,2,3..., хочет чтоб оно само проинкрементировалось

Это сообщение отредактировал(а) 17dufa - 14.4.2010, 16:02
PM MAIL   Вверх
djamshud
Дата 14.4.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Нельзя так сделать, Flag<>::value может вызываться в цикле - и где храниться счетчику, как не в памяти? Не будет же компилятор пытаться прокрутить все циклы заранее :).

Считайте внутренней переменной-счетчиком.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 14.4.2010, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(17dufa @  14.4.2010,  16:01 Найти цитируемый пост)
azesmcar, я так понимаю топикастер не хочет в ручную считать 1,2,3..., хочет чтоб оно само проинкрементировалось

это вряд ли, сомневаюсь что выйдет.
PM   Вверх
SABROG
Дата 14.4.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(azesmcar @  14.4.2010,  16:00 Найти цитируемый пост)
А так?

smile те же яйца. Я хочу, чтобы на автомате циферка увеличивалась.

Цитата(17dufa @  14.4.2010,  16:01 Найти цитируемый пост)
azesmcar, я так понимаю топикастер не хочет в ручную считать 1,2,3..., хочет чтоб оно само проинкрементировалось

Угу.

Цитата(17dufa @  14.4.2010,  16:01 Найти цитируемый пост)
SABROG, немного не эквивалентноsmile с 0 или 1 начинается.

Да, мой косяк.

Код

    enum MyModeFlag {
        NoOptions = 0,
        Option1 =   1L << 0,
        Option2 =   1L << 1,
        Option3 =   1L << 2,
        Option4 =   1L << 3,
        Option5 =   1L << 4
    };


Это сообщение отредактировал(а) SABROG - 14.4.2010, 16:55


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
azesmcar
Дата 14.4.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



чтобы не писать циферки вручную могу предложить такой вариант
Код

template <int T>
struct Flag
{
    enum { value = (1L << T) };
};

enum MyModeFlag
{
    NoOptions,
    Option1,
    Option2,
    Option3,
    Option4,
    Option5
};

Flag<Option1>::value
Flag<Option2>::value
Flag<Option3>::value
...


Добавлено через 1 минуту и 19 секунд
Цитата(SABROG @  14.4.2010,  16:13 Найти цитируемый пост)
те же яйца. Я хочу, чтобы на автомате циферка увеличивалась.

и где она должна хранится? smile 
PM   Вверх
SABROG
Дата 14.4.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(djamshud @  14.4.2010,  16:10 Найти цитируемый пост)
Считайте внутренней переменной-счетчиком. 

Не хочу, предполагая, что программа может собираться с отключенной оптимизацией.

Цитата(djamshud @  14.4.2010,  16:10 Найти цитируемый пост)
Нельзя так сделать, Flag<>::value может вызываться в цикле - и где храниться счетчику, как не в памяти?

Пусть в памяти, но препроцессора, а не моей программы.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
qweqwe
Дата 14.4.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.1.2007

Репутация: нет
Всего: 0



мне кажется, это можно сделать с помощью препроцессора
я не уверен, так как давненько не писал на плюсах
Код

//file enum_element_generator.h
#if Min < Max
 ElemName = 1L << Min,
 #define Min (Min + 1)
 #include "enum_element_generator.h"
#else
ElemName = 1L << Min
// завершение итерации


Код

//main.cpp
...

enum MyModelFlag
{
#    define ElemName Option
#    define Min 1
#    define Max 5
#    include "enum_element_generator.h"
};

в результате должно получиться что-то вроде этого:
Код

enum MyModelFlag
{
    Option1 = 1,
    Option2 = (1 + 1),
    Option3 = ((1 + 1) + 1),
    Option4 = (((1 + 1) + 1) + 1),
    Option5 = ((((1 + 1) + 1) + 1) + 1)
};


Это сообщение отредактировал(а) qweqwe - 14.4.2010, 16:24
PM MAIL   Вверх
djamshud
Дата 14.4.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



>Пусть в памяти, но препроцессора, а не моей программы.

Код

for(;;)
int value=myshit<>::value;


И что прикажите делать компилятору? Или он должен поверить на слово, что никакой динамики от вас не предвидится? Препроцессор же тут вообще ни при чем, не он шаблонами вертит.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
qweqwe
Дата 14.4.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 31.1.2007

Репутация: нет
Всего: 0



эээ, нет
такое с плюсовым препроцессором не пройдет  smile 
PM MAIL   Вверх
SABROG
Дата 14.4.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 4
Всего: 91



Цитата(djamshud @  14.4.2010,  16:24 Найти цитируемый пост)
И что прикажите делать компилятору?

Начать генерить  развернутый цикл и выдать ошибку компиляции при overflow.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 14.4.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(SABROG @  14.4.2010,  15:35 Найти цитируемый пост)
Начать генерить  развернутый цикл и выдать ошибку компиляции при overflow. 

в плюсах for не статический и поэтому не получится smile



--------------------
PM MAIL WWW   Вверх
xvr
Дата 15.4.2010, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Метапрограмирование в плюсах строится на константах, условных выражениях (реализуется через частичную специализацию шаблонов) и рекурсии (рекурсивная подстановка шаблонов). Для переменных в метапрограмировании просто нет соотвествующей синтаксической конструкции. То, что требует ТС подразумевает использование переменной (для хранения номера генерируемого enum'а), т.е. это невозможно в принципе  smile 

Ряд 1/2/4/... можно сгенерить при помощи (мета)рекурсии, но как его собрать потом в один enum ума не приложу  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.