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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
LosAngeles
Заблокирован
#1

шаблоны - C++

31.07.2011, 11:36. Просмотров 3084. Ответов 61

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2011, 11:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос шаблоны (C++):

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

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

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

Шаблоны C++ - C++
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке int out_param = (int)param;...

Шаблоны - C++
Я разбираюсь с ООП в С++ и застрял на шаблонах, будьте добры приведите пример кода, к примеру там.... вес машины и шаблон,(ну вообщем на...

Шаблоны - C++
// ConsoleApplication176.cpp : Defines the entry point for the console application. // template&lt;class type&gt; struct link { type...

61
LosAngeles
Заблокирован
31.07.2011, 12:38  [ТС] #16
Цитата Сообщение от niXman Посмотреть сообщение
тоже специализировать руками
жаль, я ещё попытался добавить операцию деления Ну то есть Yes это же единица, а No это 0, я думал тогда компилятор выберет наиболее подходящий шаблон, в котором деления на ноль нету, однако потом вычитал, что SFINAE на неправильные вычисления не распространяется, а жаль((
0
Evg
Эксперт CАвтор FAQ
18031 / 6263 / 427
Регистрация: 30.03.2009
Сообщений: 17,214
Записей в блоге: 27
31.07.2011, 12:41 #17
Цитата Сообщение от niXman Посмотреть сообщение
я и не предлагал кучу конечных специализаций. их должно быть две. но чтоб компилятору объяснить кто POD а кто нет, придется руками написать специализации шаблона is_pod<> для POD`ов.
А... понятно...
В итоге получается что можно сделать и так и сяк, один фиг оба решения по сути череж..ные
0
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 12:43 #18
Цитата Сообщение от Evg Посмотреть сообщение
череж..ные
да. так и живем
все равно, с++ лучший ЯП в мире
1
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
31.07.2011, 13:16 #19
Можно и без шаблонов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <typeinfo>
 
template<class T>
struct IsClass 
{
    bool operator() ()
    {
        const char* str = typeid(T).name();
        return (((strstr(str,"class") != NULL) || (strstr(str,"struct") != NULL)) && ( *(str+strlen(str) - 1) != '*'));
    }
};
 
int main()
{
    std::cout << std::boolalpha << IsClass<int>()() << std::endl;
    std::cout << std::boolalpha << IsClass<std::ostream>()() << std::endl;
    std::cout << std::boolalpha << IsClass<std::ostream*>()() << std::endl;
 
    std::cin.get();
    std::cin.get();
 
    return 0;
}
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
31.07.2011, 13:22 #20
Без шаблонов не интересно.
Мне кажется, изначально хотелось чего-то вроде этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
 
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 };
};
 
template<typename T>
class Class {
  private:
 
    template <typename C, bool>
    struct Internal
    {
        static
        bool func(C const& x, C const& y)
        {
            return true;
        }
    };
 
    template <typename C>
    struct Internal<C, false>
    {
        static
        bool func(C const& x, C const& y)
        {
            return false;
        }
    };
 
  public:
    bool operator()(T const& lhs, T const& rhs)
    {
        return Internal<T, IsClassT<T>::Yes>::func(lhs, rhs);
    }
};
 
 
class A
{
};
 
int main()
{
    Class<A> c1;
    Class<int> c2;
 
    A a1, a2;
    int i1, i2;
 
    std::cout << "result with class A: " << std::boolalpha << c1(a1, a2) << std::endl;
    std::cout << "result with int: " << std::boolalpha << c2(i1, i2) << std::endl;
 
    return 0;
}
Если бы была разрешена частичная специализация шаблонов-функций, то внутренняя структура, наверное, не понадобилась бы.
1
LosAngeles
Заблокирован
31.07.2011, 13:32  [ТС] #21
это не совсем по теме, но если уж на то пошло, то name насколько мне известно не стандартизированна. Её вывод implementation-defined в С++03 или нет? Да и зачем нужны эти телодвижения когда можно это проверить на этапе компиляции.

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

Не по теме:

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


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

просто гений был не полностью гений. ничего, научится.
а вообще, ваша история приводит именно эту параллель
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 17:47 #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
можно и до того дойти, что STL не использовать, ибо там сплошь код в заголовочных файлах, он трудно читаем и т.д.
но его не нужно ни читать, ни тем более понимать. нужно всего лишь правильно использовать. хотя работа сталкивала и с человеком, который написал свой класс вектор, потому что не смог разобраться в исходнике стандартного.
Цитата Сообщение от grizlik78 Посмотреть сообщение
Очень похоже на рекомендацию не изучать шаблоны, так как они нафиг не нужны.
нет, это не есть рекомендация не изучать шаблоны. просто если купили ребенку электродрель, нужно проследить, чтобы он не пытался теперь все делать исключительно с ее помощью. даже если это в принципе позможно.
0
31.07.2011, 17:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2011, 17:47
Привет! Вот еще темы с ответами:

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

Шаблоны - C++
Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать...

Шаблоны С++ - C++
template &lt;typename T_sizeCapacity&gt; class SomeClass { public: T_sizeCacity size; }; Как сделать чтобы T_sizeCapacity мог быть...

Шаблоны - C++
Не пойму что я неправильно делаю. Как не переделывал, всё равно не получалось. Может кто сможет чем помочь. А задача следующая-надо было...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru