Только что разговаривали с коллегой о всяких макро-пакостях в C++. Придумали такой вариант:
// Put this to some secluded nooktemplate< typename T >
T* B6085443BCE84d0489BD76C74663E951( T* p )
{
static T* q = p;
T* const result = q == p ? p : q;
q = p;
return result;
}
#define this B6085443BCE84d0489BD76C74663E951( this )
// Happy debugging!
Здравствуйте, anonim_44ax, Вы писали:
I>>Так в чем прикол? _>Это понять только С++ программерам.
I>>Если охото напакастить, то можно гораздо более изощерено придумать. _>Ну так придумайте.
Так ведь сказал же уже "Неохота..."
Пакости — детское занятие. Ну и пакостников тоже, конечно.
...Не царское это дело.
.
Это я Вас как математик математика спрашиваю:
Что такое математика?
Один из законов Божьих или это сам Бог и есть? (ХХ век)
I>>>Если охото напакастить, то можно гораздо более изощерено придумать. _>>Ну так придумайте.
VM>Так ведь сказал же уже "Неохота..."
Значицца понты кидаем, батенька.
Здравствуйте, drx, Вы писали:
drx>Только что разговаривали с коллегой о всяких макро-пакостях в C++. Придумали такой вариант: drx>
drx>// Put this to some secluded nook
drx>template< typename T >
drx>T* B6085443BCE84d0489BD76C74663E951( T* p )
drx>{
drx> static T* q = p;
drx> T* const result = q == p ? p : q;
drx> q = p;
drx> return result;
drx>}
drx>#define this B6085443BCE84d0489BD76C74663E951( this )
drx>// Happy debugging!
drx>
Ничего не понятно, объясните плз...
Одинаковые ошибки необязательно делать каждый раз, достаточно сделать одну, а затем обращаться к ней по мере необходимости из любого места программы.
Здравствуйте, Max404.NET, Вы писали:
MN>Здравствуйте, drx, Вы писали:
drx>>Только что разговаривали с коллегой о всяких макро-пакостях в C++. Придумали такой вариант: drx>>
drx>>// Put this to some secluded nook
drx>>template< typename T >
drx>>T* B6085443BCE84d0489BD76C74663E951( T* p )
drx>>{
drx>> static T* q = p;
drx>> T* const result = q == p ? p : q;
drx>> q = p;
drx>> return result;
drx>>}
drx>>#define this B6085443BCE84d0489BD76C74663E951( this )
drx>>// Happy debugging!
drx>>
MN>Ничего не понятно, объясните плз...
Каждое обращение по this на самом деле вызовет обращение по "предыдущему" this.
Мне только не понятна фраза
T* const result = q == p ? p : q;
Разве это не эквивалент просто
T* const result = q;
Здравствуйте, Axc, Вы писали:
drx>> T* const result = q == p ? p : q; Axc>Я чего-то не того. result = q?
Нет.
Это выражение компилится так, как будто бы оно выглядело следующим образом:
T* const result = ((q == p) ? p : q);
RTFM, вобщем. Боюсь, что придётся копаться в грамматике языка, т.к. AFAIR Страсутруп в своей книге не стал объяснять подобный случай, а сразу отослал к грамматике.
Здравствуйте, e-Xecutor, Вы писали:
drx>>#define this B6085443BCE84d0489BD76C74663E951( this ) EX>Warning: Redefined keyword this EX>не прокатит
А что за компилятор? Наверное, какой-нибудь не-mainstream'овый вроде CodeWarrior?
MSVC 7.1, MSVC 8.0, GCC 3.4.5, Comeau Online 4.3.9 ALPHA компилят это без warning'ов.
IMHO, правильно делает твой компилятор, что проверяет ключевые слова на предмет macro redefinition
Здравствуйте, alexqc, Вы писали:
A>Мне только не понятна фраза A>T* const result = q == p ? p : q; A>Разве это не эквивалент просто A>T* const result = q;
Проблема приведённого мной варианта в том, что дебаггер вполне может зайти в темплейт, и тогда правда быстро вылезет наружу.
Приведённый ниже вариант лишён этого недостатка:
#define this (this && __LINE__ % 10 == 1 ? this + 1 : this)
drx>>> T* const result = q == p ? p : q; Axc>>Я чего-то не того. result = q?
drx>Нет. drx>Это выражение компилится так, как будто бы оно выглядело следующим образом: drx>
drx>T* const result = ((q == p) ? p : q);
drx>
Зря я убрал из своей подписи сертификат...
Следите за руками: если q != p, то выбираем q. Если q == p, то выбираем p, которое равно q.
Здравствуйте, Axc, Вы писали:
Axc>Следите за руками: если q != p, то выбираем q. Если q == p, то выбираем p, которое равно q.
Кручу-верчу, обмануть хочу
А если запустить несколько раз с разными значениями p?
B6085443BCE84d0489BD76C74663E951( a ) // вернёт a
B6085443BCE84d0489BD76C74663E951( a ) // вернёт a
B6085443BCE84d0489BD76C74663E951( b ) // вернёт a
B6085443BCE84d0489BD76C74663E951( b ) // вернёт b
B6085443BCE84d0489BD76C74663E951( a ) // вернёт b
B6085443BCE84d0489BD76C74663E951( c ) // вернёт a
Здравствуйте, Axc, Вы писали:
Axc>Я ж не говорю, что код вообще не работает. Я говорю о конкретной строке.
Хорошо, постараюсь объяснить другими словами.
Ты, наверное, не обратил внимание на static в объявлении q.
Axc>если q != p, то выбираем q. Если q == p, то выбираем p, которое равно q.
p эквивалентно q только при первом вызове функции. Все последующие вызовы q имеет значение "предыдущего" p.
Либо мне непонятна твоя логика, либо я не понял, с чем в исходном посте ты не согласен.
Ты не мог бы подробнее написать, какой фрагмент кода тебя смутил и почему?