Форум программистов, компьютерный форум CyberForum.ru

шаблоны - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
LosAngeles
Заблокирован
31.07.2011, 11:36     шаблоны #1
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было передано в аргументах - класс или некласс. Приведу пример

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::*?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2011, 11:36     шаблоны
Посмотрите здесь:

шаблоны C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». C++
Шаблоны в C++ C++
Шаблоны C++
C++ Шаблоны
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
31.07.2011, 13:32  [ТС]     шаблоны #21
это не совсем по теме, но если уж на то пошло, то name насколько мне известно не стандартизированна. Её вывод implementation-defined в С++03 или нет? Да и зачем нужны эти телодвижения когда можно это проверить на этапе компиляции.

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

Не по теме:

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


LosAngeles, не увлекайся возможностями шаблонов и не пытайся запрограммировать всю работу на шаблонах...
Шаблоны для полноценного программирования много чего НЕ имеют, что приходится вывертами с учетом SFINAE реализовывать.
Самое правильное использование шаблонов - обобщенные контейнеры и алгоритмы.
Остальное - от лукавого...
С типами лучше работать в рантайме - для того виртуальность нам и дана. А еще RTTI можно использовать.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 17:27     шаблоны #26
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
LosAngeles, не увлекайся возможностями шаблонов и не пытайся запрограммировать всю работу на шаблонах...
золотые слова! расскажу историю из практики. получила наша фирма как-то проект большой, сроки были сжатые очень, пригласили двоих экстернов на год. один из них решил кое-что "автоматизировать". месяца два что-то варил, как оно работает, никому объяснить не сумел, сказал только, что "все это очень сложно" и "оно все правильно работает". смотреть вовнутрь было страшно, но все и старись не смотреть. оно действительно как-то работало. проследить как - ни в дибаггере ни по записям в логи было невозможно. по крайней мере понять почему так и какую-то найти логику.
и так было, пока вдруг не стала проявляться с устойчивой регулярностью ошибка. гений уже у нас не работал, дали одному разобраться и исправить. через неделю он сказал, что может только все это заново написать. дали второму, через пару дней заявил то же самое. я вообще отказался вовнутрь смотреть. практически весь код содержится в *.h файлах и выглядит не то что непривычно, а вообще не как код. что-то подобное я видел, когда разбирался с какими-то файлами конфигурации в юниксе.
в общем, призвали гения обратно. он пришел, попялился до обеда в свои буковки, извинился и тихо ушел. когда встречаешь на улице - отводит глаза, делает вид, что не узнал.
в конце-концов переписал негений всю эту кухню, и все опять работает. и без ошибок. и если поменять что-то нужно - любому скажи, полезет, разберется и поменяет.
кстати, экзешник после того как переписали, стал раз в 10 короче. у гения был задумано так, что на каждый пук создавался по его темплейтам новый класс, содержащий поля, которые в свою очередь создавались по темплейтам, которые ...
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 17:38     шаблоны #27
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
С типами лучше работать в рантайме - для того виртуальность нам и дана. А еще RTTI можно использовать.
хотелось бы понять, как вы примените виртуальность к POD`ам?
а еще, не понятно, для чего намеренно городить оверхед...
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
31.07.2011, 17:41     шаблоны #28
Цитата Сообщение от novi4ok Посмотреть сообщение
у гения был задумано так, что на каждый пук создавался по его темплейтам новый класс, содержащий поля, которые в свою очередь создавались по темплейтам, которые ...
Подобное и без шаблонов возможно, хотя и сложнее, да. Главное в крайности не впадать, а то так можно и до того дойти, что STL не использовать, ибо там сплошь код в заголовочных файлах, он трудно читаем и т.д.
Очень похоже на рекомендацию не изучать шаблоны, так как они нафиг не нужны.
На самом же деле надо очень тщательно изучать шаблоны, чтобы знать их возможности и ограничения, и использовать их когда это действительно выгодно. А в процессе изучения просто придётся построить кучу бесполезных велосипедов.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 17:42     шаблоны #29
Цитата Сообщение от novi4ok Посмотреть сообщение
золотые слова!
золотой бред!

просто гений был не полностью гений. ничего, научится.
а вообще, ваша история приводит именно эту параллель
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 17:47     шаблоны #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
можно и до того дойти, что STL не использовать, ибо там сплошь код в заголовочных файлах, он трудно читаем и т.д.
но его не нужно ни читать, ни тем более понимать. нужно всего лишь правильно использовать. хотя работа сталкивала и с человеком, который написал свой класс вектор, потому что не смог разобраться в исходнике стандартного.
Цитата Сообщение от grizlik78 Посмотреть сообщение
Очень похоже на рекомендацию не изучать шаблоны, так как они нафиг не нужны.
нет, это не есть рекомендация не изучать шаблоны. просто если купили ребенку электродрель, нужно проследить, чтобы он не пытался теперь все делать исключительно с ее помощью. даже если это в принципе позможно.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
31.07.2011, 17:55     шаблоны #31
Цитата Сообщение от novi4ok Посмотреть сообщение
чтобы он не пытался теперь все делать исключительно с ее помощью. даже если это в принципе возможно.
Только это же можно сказать и про классы, и про C++, и про компьютер...
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 18:03     шаблоны #32
Цитата Сообщение от grizlik78 Посмотреть сообщение
Только это же можно сказать и про классы, и про C++, и про компьютер...
смело подписываюсь рядом.
LosAngeles
Заблокирован
31.07.2011, 19:07  [ТС]     шаблоны #33
Цитата Сообщение от novi4ok Посмотреть сообщение
золотые слова! расскажу историю из практики. получила наша фирма как-то проект большой, сроки были сжатые очень, пригласили двоих экстернов на год. один из них решил кое-что "автоматизировать". месяца два что-то варил, как оно работает, никому объяснить не сумел, сказал только, что "все это очень сложно" и "оно все правильно работает". смотреть вовнутрь было страшно, но все и старись не смотреть. оно действительно как-то работало. проследить как - ни в дибаггере ни по записям в логи было невозможно. по крайней мере понять почему так и какую-то найти логику.
и так было, пока вдруг не стала проявляться с устойчивой регулярностью ошибка. гений уже у нас не работал, дали одному разобраться и исправить. через неделю он сказал, что может только все это заново написать. дали второму, через пару дней заявил то же самое. я вообще отказался вовнутрь смотреть. практически весь код содержится в *.h файлах и выглядит не то что непривычно, а вообще не как код. что-то подобное я видел, когда разбирался с какими-то файлами конфигурации в юниксе.
в общем, призвали гения обратно. он пришел, попялился до обеда в свои буковки, извинился и тихо ушел. когда встречаешь на улице - отводит глаза, делает вид, что не узнал.
в конце-концов переписал негений всю эту кухню, и все опять работает. и без ошибок. и если поменять что-то нужно - любому скажи, полезет, разберется и поменяет.
кстати, экзешник после того как переписали, стал раз в 10 короче. у гения был задумано так, что на каждый пук создавался по его темплейтам новый класс, содержащий поля, которые в свою очередь создавались по темплейтам, которые ...
а эта правдивая история относится как то к теме или вобще шаблонам? Если этот программист написал чё то через жопу, то это лично его и вашей фирмы проблемы, а не шаблонов или языка или ещё чего
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 19:30     шаблоны #34
Цитата Сообщение от LosAngeles Посмотреть сообщение
а эта правдивая история относится как то к теме или вобще шаблонам? Если этот программист написал чё то через жопу, то это лично его и вашей фирмы проблемы, а не шаблонов или языка или ещё чего
твоя цитата?
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было передано в аргументах - класс или некласс.
ты тему открыл, вопрос задал. я мое мнение высказал: это - попытка сделать что-то через жопу с помощью шаблонов.
приведу аргумент, чтобы ты зря не обижался. потому что шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов. а ты пытаешься выкрутить руки этой концепции, и сделать различное поведение для различных типов. для решения таких задач не через жопу существуют другие концепции.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
31.07.2011, 19:44     шаблоны #35
Цитата Сообщение от novi4ok Посмотреть сообщение
потому что шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов. а ты пытаешься выкрутить руки этой концепции, и сделать различное поведение для различных типов.
Это в теории. А на практике это работает только в тривиальных случаях. Иначе бы не появилась возможность специализации шаблонов.
LosAngeles
Заблокирован
31.07.2011, 19:58  [ТС]     шаблоны #36
Цитата Сообщение от novi4ok Посмотреть сообщение
ты тему открыл, вопрос задал. я мое мнение высказал
я где то спрашивал твоё мнение? Я же сказал, что задача абстрактная и возможно не имеет применения, и ты при этом предъявляешь претензии, что задача бесполезная?
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 20:31     шаблоны #37
Цитата Сообщение от novi4ok Посмотреть сообщение
шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов.
допустим..

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

Цитата Сообщение от novi4ok Посмотреть сообщение
для решения таких задач не через жопу существуют другие концепции.
например?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.08.2011, 10:09     шаблоны #38
novi4ok, Если не умеете пользоваться метапрограммированием на С++ - не стоит отговаривать других. Это бывает как минимум интересно, а так же бывает (хоть и редко) полезно.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2011, 10:37     шаблоны #39
изнасиловать можно любую парадигму. и даже оргазм при этом испытать. но задачи таким образом решать - извращение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 11:07     шаблоны
Еще ссылки по теме:

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны C++
C++ Шаблоны C++11
C++ Шаблоны в C++

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

Или воспользуйтесь поиском по форуму:
LosAngeles
Заблокирован
01.08.2011, 11:07  [ТС]     шаблоны #40
Цитата Сообщение от novi4ok Посмотреть сообщение
но задачи таким образом решать - извращение
ааа то есть задача нормальная, а решение которое предложил grizlik78 тебе не нравится? ну так ты покажи своё мы все полюбуемся. С умным видом орать, что всё вокруг говно любой дурак сможет
Yandex
Объявления
01.08.2011, 11:07     шаблоны
Ответ Создать тему

Метки
полиморфизм, шаблоны, шаблоны полиморфизм
Опции темы

Текущее время: 18:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru