Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
Заблокирован
1

шаблоны

31.07.2011, 11:36. Показов 4560. Ответов 61

Author24 — интернет-сервис помощи студентам
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было передано в аргументах - класс или некласс. Приведу пример

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename T>
class Class {
  private:
 
    template<typename C> bool func(C const& x, C const& y, int C::*)
    {
        return true;
    }
 
    template<typename C> bool func(...)
    {
        return false;
    }
 
  public:
    bool operator()(T const& lhs, T const& rhs)
    {
        return func<T>(lhs, rhs, 0);
    }
};
пример конечно неважный, но суть ясна - в зависимости от того, что подставлять заместо Т этот недофунктор ведёт себя по разному. Пользователь не видит ужасного быдлокода между строками 5-13 и это радует, но не совсем. Я тут подумал может как то присобачить можно этот пример из книжки по шаблонам:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T>
class IsClassT {
  private:
    typedef char One;
    typedef struct { char a[2]; } Two;
    template<typename C> static One test(int C::*);
 
    template<typename C> static Two test(...);
  public:
    enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
    enum { No = !Yes };
};
вдруг я ещё захочу пятьсот классов написать, а такой синтаксис нагоняет тоску... Можно как-то эти Yes и No присобачить заместо int C::*?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2011, 11:36
Ответы с готовыми решениями:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем,...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов...

Шаблоны
Добрый день. Не могли бы объяснить вот этот вопрос: Допускают ли шаблоны вложенность описания?

61
Заблокирован
31.07.2011, 13:32  [ТС] 21
Author24 — интернет-сервис помощи студентам
это не совсем по теме, но если уж на то пошло, то name насколько мне известно не стандартизированна. Её вывод implementation-defined в С++03 или нет? Да и зачем нужны эти телодвижения когда можно это проверить на этапе компиляции.

Добавлено через 7 минут
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если бы была разрешена частичная специализация шаблонов-функций, то внутренняя структура, наверное, не понадобилась бы.
да, со структурой ты здорово замутил. Похоже вопрос решён
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 13:39 22
Цитата Сообщение от LosAngeles Посмотреть сообщение
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было передано в аргументах - класс или некласс.
а можно еще написать один шаблон (или класс, или ф-ю) "на все случаи жизни", который будет вообще делать ВСЕ. причем всегода то что нужно для каждого типа, который воткнули в шаблон. больше вообще никогда ничего нового программировать не понадобится. и даже пару применчиков с "hello, world!" (если тип - world), "hello, zhopa!" (если zhopa) создать для учебника. пользоваться этим творением или развивать его никто не будет, но для поупражнять (позас*рать) мозги - очень хорошо.
не стремись найти самое сложное решение для самой простой задачи. лучше наоборот.
0
Заблокирован
31.07.2011, 13:49  [ТС] 23
Цитата Сообщение от novi4ok Посмотреть сообщение
а можно еще написать один шаблон (или класс, или ф-ю) "на все случаи жизни", который будет вообще делать ВСЕ. причем всегода то что нужно для каждого типа, который воткнули в шаблон. больше вообще никогда ничего нового программировать не понадобится
сарказм не понятен.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 14:04 24
а мне непонятна твоя цель. или проблему решить, или просто что-нибудь поделать.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
31.07.2011, 16:09 25

Не по теме:

LosAngeles просто осваивает шаблоны. Знакомое чувство: и так можно, и эдак! А вот так еще можно? Жаль, нельзя... :)


LosAngeles, не увлекайся возможностями шаблонов и не пытайся запрограммировать всю работу на шаблонах...
Шаблоны для полноценного программирования много чего НЕ имеют, что приходится вывертами с учетом SFINAE реализовывать.
Самое правильное использование шаблонов - обобщенные контейнеры и алгоритмы.
Остальное - от лукавого...
С типами лучше работать в рантайме - для того виртуальность нам и дана. А еще RTTI можно использовать.
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 17:27 26
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
LosAngeles, не увлекайся возможностями шаблонов и не пытайся запрограммировать всю работу на шаблонах...
золотые слова! расскажу историю из практики. получила наша фирма как-то проект большой, сроки были сжатые очень, пригласили двоих экстернов на год. один из них решил кое-что "автоматизировать". месяца два что-то варил, как оно работает, никому объяснить не сумел, сказал только, что "все это очень сложно" и "оно все правильно работает". смотреть вовнутрь было страшно, но все и старись не смотреть. оно действительно как-то работало. проследить как - ни в дибаггере ни по записям в логи было невозможно. по крайней мере понять почему так и какую-то найти логику.
и так было, пока вдруг не стала проявляться с устойчивой регулярностью ошибка. гений уже у нас не работал, дали одному разобраться и исправить. через неделю он сказал, что может только все это заново написать. дали второму, через пару дней заявил то же самое. я вообще отказался вовнутрь смотреть. практически весь код содержится в *.h файлах и выглядит не то что непривычно, а вообще не как код. что-то подобное я видел, когда разбирался с какими-то файлами конфигурации в юниксе.
в общем, призвали гения обратно. он пришел, попялился до обеда в свои буковки, извинился и тихо ушел. когда встречаешь на улице - отводит глаза, делает вид, что не узнал.
в конце-концов переписал негений всю эту кухню, и все опять работает. и без ошибок. и если поменять что-то нужно - любому скажи, полезет, разберется и поменяет.
кстати, экзешник после того как переписали, стал раз в 10 короче. у гения был задумано так, что на каждый пук создавался по его темплейтам новый класс, содержащий поля, которые в свою очередь создавались по темплейтам, которые ...
1
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 17:38 27
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
С типами лучше работать в рантайме - для того виртуальность нам и дана. А еще RTTI можно использовать.
хотелось бы понять, как вы примените виртуальность к POD`ам?
а еще, не понятно, для чего намеренно городить оверхед...
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
31.07.2011, 17:41 28
Цитата Сообщение от novi4ok Посмотреть сообщение
у гения был задумано так, что на каждый пук создавался по его темплейтам новый класс, содержащий поля, которые в свою очередь создавались по темплейтам, которые ...
Подобное и без шаблонов возможно, хотя и сложнее, да. Главное в крайности не впадать, а то так можно и до того дойти, что STL не использовать, ибо там сплошь код в заголовочных файлах, он трудно читаем и т.д.
Очень похоже на рекомендацию не изучать шаблоны, так как они нафиг не нужны.
На самом же деле надо очень тщательно изучать шаблоны, чтобы знать их возможности и ограничения, и использовать их когда это действительно выгодно. А в процессе изучения просто придётся построить кучу бесполезных велосипедов.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 17:42 29
Цитата Сообщение от novi4ok Посмотреть сообщение
золотые слова!
золотой бред!

просто гений был не полностью гений. ничего, научится.
а вообще, ваша история приводит именно эту параллель
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 17:47 30
Цитата Сообщение от grizlik78 Посмотреть сообщение
можно и до того дойти, что STL не использовать, ибо там сплошь код в заголовочных файлах, он трудно читаем и т.д.
но его не нужно ни читать, ни тем более понимать. нужно всего лишь правильно использовать. хотя работа сталкивала и с человеком, который написал свой класс вектор, потому что не смог разобраться в исходнике стандартного.
Цитата Сообщение от grizlik78 Посмотреть сообщение
Очень похоже на рекомендацию не изучать шаблоны, так как они нафиг не нужны.
нет, это не есть рекомендация не изучать шаблоны. просто если купили ребенку электродрель, нужно проследить, чтобы он не пытался теперь все делать исключительно с ее помощью. даже если это в принципе позможно.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
31.07.2011, 17:55 31
Цитата Сообщение от novi4ok Посмотреть сообщение
чтобы он не пытался теперь все делать исключительно с ее помощью. даже если это в принципе возможно.
Только это же можно сказать и про классы, и про C++, и про компьютер...
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 18:03 32
Цитата Сообщение от grizlik78 Посмотреть сообщение
Только это же можно сказать и про классы, и про C++, и про компьютер...
смело подписываюсь рядом.
0
Заблокирован
31.07.2011, 19:07  [ТС] 33
Цитата Сообщение от novi4ok Посмотреть сообщение
золотые слова! расскажу историю из практики. получила наша фирма как-то проект большой, сроки были сжатые очень, пригласили двоих экстернов на год. один из них решил кое-что "автоматизировать". месяца два что-то варил, как оно работает, никому объяснить не сумел, сказал только, что "все это очень сложно" и "оно все правильно работает". смотреть вовнутрь было страшно, но все и старись не смотреть. оно действительно как-то работало. проследить как - ни в дибаггере ни по записям в логи было невозможно. по крайней мере понять почему так и какую-то найти логику.
и так было, пока вдруг не стала проявляться с устойчивой регулярностью ошибка. гений уже у нас не работал, дали одному разобраться и исправить. через неделю он сказал, что может только все это заново написать. дали второму, через пару дней заявил то же самое. я вообще отказался вовнутрь смотреть. практически весь код содержится в *.h файлах и выглядит не то что непривычно, а вообще не как код. что-то подобное я видел, когда разбирался с какими-то файлами конфигурации в юниксе.
в общем, призвали гения обратно. он пришел, попялился до обеда в свои буковки, извинился и тихо ушел. когда встречаешь на улице - отводит глаза, делает вид, что не узнал.
в конце-концов переписал негений всю эту кухню, и все опять работает. и без ошибок. и если поменять что-то нужно - любому скажи, полезет, разберется и поменяет.
кстати, экзешник после того как переписали, стал раз в 10 короче. у гения был задумано так, что на каждый пук создавался по его темплейтам новый класс, содержащий поля, которые в свою очередь создавались по темплейтам, которые ...
а эта правдивая история относится как то к теме или вобще шаблонам? Если этот программист написал чё то через жопу, то это лично его и вашей фирмы проблемы, а не шаблонов или языка или ещё чего
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 19:30 34
Цитата Сообщение от LosAngeles Посмотреть сообщение
а эта правдивая история относится как то к теме или вобще шаблонам? Если этот программист написал чё то через жопу, то это лично его и вашей фирмы проблемы, а не шаблонов или языка или ещё чего
твоя цитата?
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было передано в аргументах - класс или некласс.
ты тему открыл, вопрос задал. я мое мнение высказал: это - попытка сделать что-то через жопу с помощью шаблонов.
приведу аргумент, чтобы ты зря не обижался. потому что шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов. а ты пытаешься выкрутить руки этой концепции, и сделать различное поведение для различных типов. для решения таких задач не через жопу существуют другие концепции.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
31.07.2011, 19:44 35
Цитата Сообщение от novi4ok Посмотреть сообщение
потому что шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов. а ты пытаешься выкрутить руки этой концепции, и сделать различное поведение для различных типов.
Это в теории. А на практике это работает только в тривиальных случаях. Иначе бы не появилась возможность специализации шаблонов.
0
Заблокирован
31.07.2011, 19:58  [ТС] 36
Цитата Сообщение от novi4ok Посмотреть сообщение
ты тему открыл, вопрос задал. я мое мнение высказал
я где то спрашивал твоё мнение? Я же сказал, что задача абстрактная и возможно не имеет применения, и ты при этом предъявляешь претензии, что задача бесполезная?
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 20:31 37
Цитата Сообщение от novi4ok Посмотреть сообщение
шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов.
допустим..

Цитата Сообщение от novi4ok Посмотреть сообщение
а ты пытаешься выкрутить руки этой концепции, и сделать различное поведение для различных типов.
и? что-то новое узнал?)

Цитата Сообщение от novi4ok Посмотреть сообщение
для решения таких задач не через жопу существуют другие концепции.
например?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.08.2011, 10:09 38
novi4ok, Если не умеете пользоваться метапрограммированием на С++ - не стоит отговаривать других. Это бывает как минимум интересно, а так же бывает (хоть и редко) полезно.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2011, 10:37 39
изнасиловать можно любую парадигму. и даже оргазм при этом испытать. но задачи таким образом решать - извращение.
0
Заблокирован
01.08.2011, 11:07  [ТС] 40
Цитата Сообщение от novi4ok Посмотреть сообщение
но задачи таким образом решать - извращение
ааа то есть задача нормальная, а решение которое предложил grizlik78 тебе не нравится? ну так ты покажи своё мы все полюбуемся. С умным видом орать, что всё вокруг говно любой дурак сможет
0
01.08.2011, 11:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2011, 11:07
Помогаю со студенческими работами здесь

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

Шаблоны
ругается на строку &quot;friend class List&lt;T&gt;;&quot;, вот что пишет: 1&gt;c:\users\slava\documents\visual...

шаблоны в си++
кто может сказать где прблема? List.h #ifndef LIST_H #define LIST_H #include&lt;iostream&gt;...

Шаблоны
Здравствуйте не объясните новичку пару аспектов про шаблоны 1)Зачем они нужны 2)Преимущества...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru