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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> макросы в плюсовом коде, макросы в плюсовом коде 
:(
    Опции темы
 
Макросы в плюсах
Пользуюсь [ 16 ]  [47.06%]
Не пользуюсь [ 13 ]  [38.24%]
Предпочитаю вместо макросов использовать ... (свой вариант в каментах) [ 5 ]  [14.71%]
А что это такое? [ 0 ]  [0.00%]
Всего проголосовавших: 34
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
boostcoder
Дата 20.4.2012, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



я бы записал код так:
Код

template<typename T_containter>
bool insert_wv_user(
   T_containter& container,
   boost::int16_t& pos,
   user_context& u_context,
   const boost::uint64_t& game_id
) {
   auto elem_pos = container.find(game_id);
   if (elem_pos != container.end())
   {
      std::deque<user_pair>& users_ref = elem_pos->second;
      auto _user_pos = std::find_if(
         users_ref.begin(),
         users_ref.end(),
         [&](const user_pair& user_item)->bool {
            return (user_item.first == u_context._id);
         }
      );

      if (_user_pos == users_ref.end())
      {
         users_ref.push_back(std::make_pair(u_context._id, &u_context));
         pos = users_ref.size();
         return false;
      }
      else
         return true;
   }
   else
   {
      std::deque<user_pair> _deque = { std::make_pair(u_context._id, &u_context) };
      container[game_id] = _deque;
      pos = 1;
      return false;
   }
}

// использование
status = insert_wv_user(_viewers, pos, *u_context, game_id)
   ? ns_reply::shared_api::e_add_viewer::ok
   : ns_reply::shared_api::e_add_viewer::exists ;


PM WWW   Вверх
serghd
Дата 20.4.2012, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(boostcoder @ 20.4.2012,  21:11)
я бы записал код так:
Код

template<typename T_containter>
bool insert_wv_user(
   T_containter& container,
   boost::int16_t& pos,
   user_context& u_context,
   const boost::uint64_t& game_id
) {
   auto elem_pos = container.find(game_id);
   if (elem_pos != container.end())
   {
      std::deque<user_pair>& users_ref = elem_pos->second;
      auto _user_pos = std::find_if(
         users_ref.begin(),
         users_ref.end(),
         [&](const user_pair& user_item)->bool {
            return (user_item.first == u_context._id);
         }
      );

      if (_user_pos == users_ref.end())
      {
         users_ref.push_back(std::make_pair(u_context._id, &u_context));
         pos = users_ref.size();
         return false;
      }
      else
         return true;
   }
   else
   {
      std::deque<user_pair> _deque = { std::make_pair(u_context._id, &u_context) };
      container[game_id] = _deque;
      pos = 1;
      return false;
   }
}

// использование
status = insert_wv_user(_viewers, pos, *u_context, game_id)
   ? ns_reply::shared_api::e_add_viewer::ok
   : ns_reply::shared_api::e_add_viewer::exists ;


тоже вариант, но не панацея... Только ты немного напутал с return'ами, но предложение я понял. 
Может так и понятнее, хз

Это сообщение отредактировал(а) serghd - 20.4.2012, 21:30
PM MAIL   Вверх
serghd
Дата 20.4.2012, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



жалко сообщения удалять нельзя, писец

Это сообщение отредактировал(а) serghd - 20.4.2012, 21:41
PM MAIL   Вверх
boostcoder
Дата 20.4.2012, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(serghd @  20.4.2012,  21:23 Найти цитируемый пост)
ты немного напутал с return'ами

я хз что там с ретурнами. задумка была в другом...

Цитата(serghd @  20.4.2012,  21:39 Найти цитируемый пост)
жалко сообщения удалять нельзя

их можно редактировать. и вместо того сообщения что хочется удалить, можно вставить многоточие.
PM WWW   Вверх
serghd
Дата 20.4.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ок, заменил...
Учитывая опыт многих отписавшихся, нельзя было в очередной раз не задуматься об области применения макросов.
Тем более, если вдруг код в дальнейшем будет сопровождаться не только автором, надо учитывать мнение большинства.

Это сообщение отредактировал(а) serghd - 20.4.2012, 22:21
PM MAIL   Вверх
boostcoder
Дата 20.4.2012, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(serghd @  20.4.2012,  22:19 Найти цитируемый пост)
надо учитывать мнение большинства

тут дело не во мнении большинства. так же, мнение большинства не всегда адекватно.

насколько мне помнится, о вреде макросов пишут чуть ли не в каждой средней книжонке...
PM WWW   Вверх
serghd
Дата 20.4.2012, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(boostcoder @ 20.4.2012,  22:35)
Цитата(serghd @  20.4.2012,  22:19 Найти цитируемый пост)
надо учитывать мнение большинства


насколько мне помнится, о вреде макросов пишут чуть ли не в каждой средней книжонке...

ни разу не встречал, хотя читал не одну. Только на форумах.
Да и ни одного убедительного аргумента в этом топике я не увидел. Т.к. всегда дотошно контролирую во что они раскрываются и не перекрывают ли что-либо, если этого не требуется.

Это сообщение отредактировал(а) serghd - 20.4.2012, 23:00
PM MAIL   Вверх
boostcoder
Дата 20.4.2012, 23:01 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(serghd @  20.4.2012,  22:55 Найти цитируемый пост)
ни одного убедительного аргумента в этом топике я не увидел

значит ответы написаны не для Вас.
PM WWW   Вверх
boostcoder
Дата 20.4.2012, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(serghd @  20.4.2012,  22:55 Найти цитируемый пост)
контролирую во что они раскрываются и не перекрывают ли что-либо

ну вот Вам пример лечения последствий. не находите? ;)
PM WWW   Вверх
mes
Дата 20.4.2012, 23:33 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(serghd @  20.4.2012,  21:55 Найти цитируемый пост)
 всегда дотошно контролирую во что они раскрываются и не перекрывают ли что-либо, если этого не требуется.
 
а никогда не хотелось потратить "дотошно" потраченное время на что нибудь полезное ?  smile 
если нет, то значит и аргументы не найдутся smile




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


Шустрый
*


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

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



Цитата(boostcoder @ 20.4.2012,  23:30)
Цитата(serghd @  20.4.2012,  22:55 Найти цитируемый пост)
контролирую во что они раскрываются и не перекрывают ли что-либо

ну вот Вам пример лечения последствий. не находите? ;)

последствий чего? В том смысле, что не надо будет контролировать или что?

Добавлено через 1 минуту и 12 секунд
Цитата(mes @ 20.4.2012,  23:33)
Цитата(serghd @  20.4.2012,  21:55 Найти цитируемый пост)
 всегда дотошно контролирую во что они раскрываются и не перекрывают ли что-либо, если этого не требуется.

а никогда не хотелось потратить "дотошно" потраченное время на что нибудь полезное ?  smile 
если нет, то значит и аргументы не найдутся smile

я всегда всё делаю дотошно. Какая разница что именно? smile 
PM MAIL   Вверх
boostcoder
Дата 20.4.2012, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(serghd @  20.4.2012,  23:35 Найти цитируемый пост)
последствий чего? В том смысле, что не надо будет контролировать или что? 

угу.

поймите же, макросы в С/С++ - огромный костыль. иначе не назовешь.
ибо это не языковые конструкции.
да и создавались макросы именно как костыль smile 

контекстнозависимые макросы - костыль вдвойне.

хорошим тоном считается использование макросов только для условной компиляции.

так же, поищите по форуму, раз 10ть только на моей памяти были срачи по поводу такой, казалось бы безобидной конструкции:
Код

#define SOME_CONSTANT 3100


я такого никогда не делаю. строго:
Код

static const size_t some_constant = 3100;

// или
enum { some_constant = 3100 };


но решать Вам, разумеется.

PM WWW   Вверх
serghd
Дата 20.4.2012, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(boostcoder @ 20.4.2012,  23:41)
Код

#define SOME_CONSTANT 3100

ну а с этой-то конструкцией что не так? "Неподчинение обычным правилам разрешения области видимости и типов"? Чем она может навредить, как запутать? 
PM MAIL   Вверх
volatile
Дата 21.4.2012, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



serghd, 
Хуже многим. достаточно хотябы того что имя константы уже нельзя использовать больше нигде.
Например ни одном в классе уже не может быть членов (ни методов ни переменных) с таким именем.
А если забудете, получится фигня, трудно определяемая.

Ответьте теперь, а чем она лучше?

PM MAIL   Вверх
serghd
Дата 21.4.2012, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(volatile @ 21.4.2012,  00:20)
serghd, 
Хуже многим. достаточно хотябы того что имя константы уже нельзя использовать больше нигде.
Например ни одном в классе уже не может быть членов (ни методов ни переменных) с таким именем.
А если забудете, получится фигня, трудно определяемая.

Да, вот это аргумент. Даже несмотря на то, что потому и ввели негласное правило именования макросов только в верхнем регистре.
Хм, ну хорошо (*вспоминает слова "только для условной компиляции" и вместе с ними boost.preprocessor...*), а как вы бы организовали код, например, следующей задачи?:
Код

#define SET_USER_ACTION(method) \
 /*..... небольшой, но ВСЕГДА ОДИНАКОВЫЙ для данной операции код .....*/
 /*...*/
 for (auto& item: old_gamers) \
 { \
  item->method; \
 } \
 for (auto& item: new_gamers) \
 { \
  item->method; \
 } \
}

//----------------

struct gamer
{
 double get_money();
 void show_info();
 void set_rating();
 // и т.п., т.е. методов может быть оч. много
};

std::vector<gamer> old_gamers;
std::vector<gamer> new_gamers;

// какой-нибудь метод какого-нибудь класса
void MyStruct::method1(user* user_context)
{
 // some code...
 
 /**
  * вызов у всех объектов обоих определённых выше 
  * контейнеров одного и того же метода */
 SET_USER_ACTION(get_money());
}

void MyStruct::method2(user* user_context)
{
 SET_USER_ACTION(show_info());
}

// и т.п. Повторюсь: методов может быть РЕАЛЬНО много

http://liveworkspace.org/code/f54fba48ad59...3ac753359385e33

Без дублирования кода и создания дополнительных типов-прослоек или дополнительных функций разумеется (но шаблоны, если они не прослойки, естественно в теме). Ведь мы же не будем оверхедить или преждевременно оптимизировать (т.е. не подумав перед оптимизацией, а всё ли мы учли?).

Это сообщение отредактировал(а) serghd - 21.4.2012, 01:17
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.2904 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


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

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