Йа волосат и бородат!
А началось все с сорцов GNU H.323 Gatekeeper, где я нашел вот такой код:

// associate a tag and its type
template<int I> struct TagInfo {
typedef RasTag<I> Tag;
typedef typename RasType<I>::Type Type;
enum {
tag = I,
// there are just 32 types of RAS, lucky!
flag = (1 << I)
};
};

// a dirty trick, but works :p
template<int I> struct RequestInfo : public TagInfo<I> {
typedef RasTag<I+1> ConfirmTag;
typedef RasTag<I+2> RejectTag;
typedef typename RasType<I+1>::Type ConfirmType;
typedef typename RasType<I+2>::Type RejectType;
};

class SimplePasswordAuth : public GkAuthenticator
{
public:
enum SupportedRasChecks {
/// bitmask of RAS checks implemented by this module
SimplePasswordAuthRasChecks = RasInfo<H225_GatekeeperRequest>::flag
| RasInfo<H225_RegistrationRequest>::flag
| RasInfo<H225_UnregistrationRequest>::flag
| RasInfo<H225_BandwidthRequest>::flag
| RasInfo<H225_DisengageRequest>::flag
| RasInfo<H225_LocationRequest>::flag
| RasInfo<H225_InfoRequest>::flag
| RasInfo<H225_AdmissionRequest>::flag
};
// .....
};


Специализация шаблонов делалась из еще одного enum'а, который сидит в сорцах протокола H.323, так что в результате на выходе для каждой специализации RasInfo<T> получалось свое значение flag, непересекающееся с другими специализациями.

ЗЫ: Да, оформление сайта я скоро поменяю, а то код сюда кидать как-то неинтересно стало.

Комментарии
17.08.2009 в 09:47

"Сконцентрируйте пучок электронов на шляпке..."
(с) Руководство по забиванию гвоздей электронным микроскопом.


17.08.2009 в 09:52

Предыдущий коммент от CTM (почему-то подпись он запилил, редиска)
CTM
18.08.2009 в 09:53

Йа волосат и бородат!
Я думаю, правильнее было бы "сфокусируйте".

А вообще, меня удивляет столь скептическое отношение к такому оч удобному механизму, как шаблоны. Как бы, незнание стандартов языка кем-либо - еще совсем не аргумент для отказа от использования самого механизма.
По поводу трудностей чтения шаблонного кода: lisp - язык оч простой, но с непривычки хрен прочтешь. Как и prolog, например.

Авторы GNU H.323 Gatekeeper придумали интересное решение для определения флагов, позволяющее определять их группами, не засоряющее макросы и неймспейсы и избавляющее от необходимости просматривать списки всех флагов в поисках незанятых значений. Пусть оно применимо далеко не везде - лично мне в нем нравится новизна подхода к данной конкретной задаче, а также простота этого кода для понимания мной. Напрягать глаза при, например, проверке списка флагов вроде
enum Tag { flag = tag1_0 | tag1_1 | tag1_2 | tag1_3 | tag2_0 | tag2_1 | tag2_2 | tag2_3 | tag3_0 | tag3_1 | tag3_2 | tag3_3 | tag4_0 | tag4_2 | tag4_3 | tag5_0 | tag5_1 | tag5_2 | tag5_3 | tag6_0 | tag6_1 | tag6_2 | tag6_3 | ... };
, пробегая глазами повторяющиеся причем длина списка может быть очень большой, лично для меня выход намного худший, чем прочитать описанный в примере список специализаций шаблона. Тем более, что я знаю, что в них внутри установлены все флаги для этой группы.

ЗЫ: Если что, в примере пропущен tag4_1 и если вы этого не заметили - это говорит о "простоте" чтения такой записи, ага.
20.08.2009 в 11:54

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

а если пройдет 3 года и тебе надо будет что-то добавить или поменять?
или объяснить это кому-то (возможно даже балбесу), который должен с этим потом работать.

Про незнание механизмов языка:
можно написать:
int i; // = 1 или = 2;
char *tmp = (char*)(&i); // специально коряво и платформо-зависимо.
*(tmp + 2) = (i & 1);
*(tmp + 3) = (i & 2);
i = ((i >> 15) | (i >> 25)) & 255;

или написать:
int i; // = 1 или = 2;
i=3-i;

Тоже механизмы языка, причем очень клевые: указатели - как ж без них! а сдвиги-то!

Тем более, что я знаю, что в них внутри установлены все флаги для этой группы

Что-то это не очевидно :(

Тимур.
20.08.2009 в 22:15

Йа волосат и бородат!
Ну начнем с того, что на разбор этого кода у меня ушло минут 5. Ну ладно, 8-10 минут, часть из которых было тупо прокликивание к определениям, да просмотр, что за файл я вообще гляжу.

По поводу твоего примера: написать-то можно, но вот только этот код будет показывать не "знание" в моем понимании этого слова (возможно надо было написать "умение"?), а скорее простую осведомленность, что оно вот так возможно, ага.

А насчет очевидности - мне было достаточно взглянуть на шаблон около 1-2 минут, чтобы понять, что это и зачем оною. Еще 3-4 минуты я потратил специально проверки ради. Так что - очевидно. :Р

ЗЫ: Ну придет к тебе программист, который не знает механизмов работы с указателями (да, есть и такие!) - ты что, весь свой код будешь переделывать или перестанешь ими пользоваться? Или пошлешь оного "незнайку" изучать механизм? Ситуация ведь та же самая, только в роли "незнайки" сейчас ты. :)
21.08.2009 в 21:28

А насчет очевидности - мне было достаточно взглянуть на шаблон около 1-2 минут, чтобы понять, что это и зачем оною. Еще 3-4 минуты я потратил специально проверки ради. Так что - очевидно. :Р
Пардон месье, но в своем посте, ты забыл 3 класса показать
1) RasTag
2) RasType
3) RasInfo
О какой очевидности можно судить если, извините, половины не хватает.
(с) Вовко
22.08.2009 в 07:51

Йа волосат и бородат!
Гм, корни сей дискуссии растут из аськи. А вот что я кидал туда - проверить не могу, ибо логи на работе.
22.08.2009 в 19:21

там тоже не хватало половины классов ))))
(с) обратно Вовко
22.08.2009 в 22:15

Йа волосат и бородат!
Хм. Возможно, забыл, каюсь. Но суть-то все равно остается той же. Я даже могу кое-кому забывчивому напомнить слова, сказанные на лабах по ООП второго курса: "Нахрен нужны эти указатели, если и без них все можно сделать!" (почти копирайт, точная формулировка утрачена за давностью лет)
Сейчас я слышу примерно то же самое, в более мягкой форме, но уже про шаблоны. И от этого как-то грустновато, да...
24.08.2009 в 13:41

Ну начнем с того, что на разбор этого кода у меня ушло минут 5. Ну ладно, 8-10 минут, часть из которых было тупо прокликивание к определениям, да просмотр, что за файл я вообще гляжу.

Просмотр списка констант от силы на 1 экран был бы и быстрее, и менее утомителен.
Можно пойти дальше. Ты не думал о том, чтобы ВЕСЬ проект реализовывать шаблонно?
Более чем уверен, твои последователи тебя не оценят.

ЗЫ: Ну придет к тебе программист, который не знает механизмов работы с указателями (да, есть и такие!) - ты что, весь свой код будешь переделывать или перестанешь ими пользоваться? Или пошлешь оного "незнайку" изучать механизм? Ситуация ведь та же самая, только в роли "незнайки" сейчас ты.

да, пошлю скорее всего, хотя и не факт.
Нет, ситуация не та же самая, т.к. в шаблонах я разбираюсь, пусть и не так хорошо, как ты.
И именно поэтому я говорю, что им не место в решении поставленной задачи (сгенерить несколько констант).

Пример отличен для демонстрации возможностей шаблонов, но использовать на практике генерацию констант через шаблоны, я бы не стал.

то что ДОЛЖНО достигаться простым способом (как i = 3-i), так и следует делать.
Более того, если кто-то напишет это сложным образом, потребую обосновать или переделать.

Тимур
24.08.2009 в 14:01

Йа волосат и бородат!
Просмотр списка констант от силы на 1 экран был бы и быстрее, и менее утомителен.
Смотря какой список по длине. Смотря какое форматирование. Плюс надо следить на пересечениями флагов.

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

Пример отличен для демонстрации возможностей шаблонов, но использовать на практике генерацию констант через шаблоны, я бы не стал.
Шаблоны идеальны для задания констант уникальных для данной машины/сессии/экземпляра программы. Так же они идеальны для задания семейств функций или классов. И все на них целиком делать уж точно не стоит, особенно то, что требует динамической работы (обращения с классами-наследниками по указателю на родителя, например).
24.08.2009 в 16:57

Смотря какой список по длине. Смотря какое форматирование.
При использовании шаблонов это еще важнее.

Плюс надо следить на пересечениями флагов.
Группируй по смыслу. так и читать проще.

Хорошо, программиста, который тоже умеет работать с указателями, но так, что лучше бы не умел.
Ну ты облажал меня! У меня что? настолько кривые руки?!
Шаблоны идеальны для задания констант уникальных для данной машины/сессии/экземпляра программы.
Согласен на 100%
Так же они идеальны для задания семейств функций или классов
Согласен на 200%
И все на них целиком делать уж точно не стоит, особенно то, что требует динамической работы
А я о чем говорю?
25.08.2009 в 09:08

Йа волосат и бородат!
Смотря какой список по длине. Смотря какое форматирование.
При использовании шаблонов это еще важнее.

Шаблон прекрасно оформляется в виде класса. И если уж можешь правильно оформить класс - то так же будет и шаблон.

Ну ты облажал меня! У меня что? настолько кривые руки?!
У тебя - достаточно прямые, чтобы это радовало. :)

И все на них целиком делать уж точно не стоит, особенно то, что требует динамической работы
А я о чем говорю?

Константы ну никак не требуют динамической работы. :Р
25.08.2009 в 11:09

Шаблон прекрасно оформляется в виде класса. И если уж можешь правильно оформить класс - то так же будет и шаблон.
ну уж тогда ты точно сможешь красиво оформить несчастный список :)

У тебя - достаточно прямые, чтобы это радовало
Спасиба на добром слове.

Константы ну никак не требуют динамической работы
я имел в виду частое внесение изменений.
но в том смысле, что ты подразумевал - тоже согласен.
25.08.2009 в 13:30

Йа волосат и бородат!
"ну уж тогда ты точно сможешь красиво оформить несчастный список"
Дык, список слишком длиннен может быть :) А вот шаблончики в таких случаях проще. Плюс, если криво инстанцируешь шаблончик (повторяющимся значением) - на тебя наорет компилятор. А вот с дефайнами такого быть не может по определению. :Р
25.08.2009 в 15:13

Дык, список слишком длиннен может быть А вот шаблончики в таких случаях проще.
ню-ню. дефайн-то короче будет.
Хотя да, при длиииинном списке почти выровняются.

Плюс, если криво инстанцируешь шаблончик (повторяющимся значением) - на тебя наорет компилятор
это клево, когда требуется уникальность.
а если нужно повторение?
25.08.2009 в 15:27

Йа волосат и бородат!
дык, в той задаче, которая рассматривалась в самом начале - нужна именно уникальность, а не повторение.
Но вопрос резонный, да, ибо шаблон как раз это исключает.

Расширенная форма

Редактировать

Подписаться на новые комментарии