![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
есть у меня булевская переменная, которая хранится где-то глубоко в структуре
и чтобы достучаться до нее нужно писать что-то типа
есть ли в С++ стандартный способ поменять ее значение, не требующий писать вот ЭТО 2 раза? типа функции std::negate (такой вроде нету), или вообще неизвестной мне конструкции языка (про варианты типа создания временной переменной-ссылки и написания своей функции negate я знаю - интересно легчайшее СТАНДАРТНОЕ решение) |
|||
|
||||
SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
g_preferences.m_visualisation.m_chapter_general.m_enable_show_filed_overlaps ^= 1;
Это сообщение отредактировал(а) SergeCpp - 14.5.2008, 14:38 |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
похоже на правду и компилер (MSVC) даже ворнинги не дает но все же спрошу - вы уверены, что это по стандарту и что для любого стандартного компилера <false> ^= 1 будет давать true и <true> ^= 1 будет давать false ? Это сообщение отредактировал(а) Alek86 - 14.5.2008, 13:25 |
|||
|
||||
SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
||||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
![]() Это сообщение отредактировал(а) SergeCpp - 14.5.2008, 13:50 |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
а вообще std::logical_not<type>(param)
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
А есть ещё ссылки:
Это так, для развития - "^= 1" лучше в данном случае. |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Не любит автор ссылки с указателями ![]() |
|||
|
||||
Alek86 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
кто тебе сказал эту ересь? ![]() обожаю просто, я добивался именно элементарной операции отрицания жаль, что ее запись неочевидна этот (цитата со стандарта)
и чем же он тут поможет? ![]() а на стандарт ссылку можно? я нашель только
но, вроде твой способ этому не противоречит + Добавлено через 11 минут и 11 секунд хотя нет, противоречит если в true вместо единицы будет двойка, то ^=1 не поможет Это сообщение отредактировал(а) Alek86 - 14.5.2008, 16:38 |
||||
|
|||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
||||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
SABROG, если тема перешла на сцылки со Стандарта, то примеры кода уже не помогут
сцылки нужно только сцылками крыть ![]() |
|||
|
||||
vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
lда то ты к стандарту то пристал? причем стандарт к стандартным оперциям с битами? ступил, думал что он меняет. конечно не поможет ![]() можно так:
|
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
ну это если четное. а для любого числа - что-нить типа
Добавлено через 1 минуту и 52 секунды хотя такому "стандартному" я бы предпочел нестандартое попроще ![]() |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Rififi, не могу одобрить... нестандартно, требует дополнительный код. Ссылка, имхо, лучше.
|
|||
|
||||
MTWizard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 8.10.2007 Где: Київ Репутация: 3 Всего: 4 |
В bool по стандарту лежат только true и false. Там нет чисел (пункт 3.9.1/6). true конвертируется в число 1, false в 0 (пункт 4.5/4). Для этих чисел получим 1^1 = 0 -> false, 0^1 = 1 -> true (как ты сам привёл в цитате). Так что всё по стандарту ![]() Это сообщение отредактировал(а) MTWizard - 14.5.2008, 19:03 |
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
А как насчет варианта перепроектировать это дело чтобы не надо было тянутся за переменными (я так понимаю там не только тот bool ![]() ![]() -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
Alek86 |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
прога не моя и немного великовата для перепроектирования и даже если была бы моя и сравнительно мелкая, то перепроектиролвать удобнее вряд ли можно было это единственное, чего я добивался и вообще весь вопрос был - как ПОПРОЩЕ стандартно инвертировать переменную про ссылки и доп. функции смотрите первый пост ЗЫ. жаль, что читающий такой код
будет долго вдуплять, что сие значит придется таки функцию писать :( |
||||
|
|||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если у тебя так наверно будет симпатичней :
P.S. про ссылки прочитал, а вот про функции упустил - сбило std::negate - она же функция плюс к тому же ИМХО любой код несуший самостоятельную логику должен быть разгружен (посредством функции) Это сообщение отредактировал(а) mes - 19.5.2008, 01:00 |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
значит он неправильно профессию выбрал ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
перефразирую читаться такой текст будет намного хуже, чем
да, это и правда получше ![]() |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Всё он правильно выбрал ![]() ![]() Такой текст тоже очень плох. Ф-ция на то и ф-ция, чтобы что-то брать на вход и что-то выдавать на выход, а не модифицировать свои входные данные. Есть конечно случаи когда это целесообразно(и примеров этому куча), но, не думаю, что в данном случае. Чем, блин? ![]() Самый лучший и понятный вариант - это с ссылкой. Он 1. понятен. 2. не уступит в производительности варианту с ^=(особенно в случае с preferences - не думаю, что кто-то станет редактировать preferences миллионы раз в секунду). 3. на случай опасности случайно изменить значение по ссылке ей можно дать ограниченную область видимости Ребят, пишите так чтобы потом (хотя бы) самим понятно было... Я с месяца полтора назад на скорую руку наклепал одну программу. Точнее говоря на скорую руку наклепал я одну её часть. Пару дней назад мне пришлось добавлять ф-ционал как раз в эту часть. И, несмотря на то, что у меня там не было таких вещей как ^= и им подобных, я половину рабочего дня(!!) сидел и пытался одуплить 1. как эти 30 строк вообще работают 2. каков необходимый результат(от этих строк) 3. как переделать так чтобы помимо добавления ф-ционала результат остался тем же -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
С этим не могу согласиться. Имхо, дело привычки. к тому же если функция названа negate, лично я ее перевожу как "поменять значение на противоположное" а не "вернуть противоположное" |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |