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

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

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

шаблоны - C++

31.07.2011, 11:36. Просмотров 3166. Ответов 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
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
31.07.2011, 17:55 #31
Цитата Сообщение от novi4ok Посмотреть сообщение
чтобы он не пытался теперь все делать исключительно с ее помощью. даже если это в принципе возможно.
Только это же можно сказать и про классы, и про C++, и про компьютер...
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 18:03 #32
Цитата Сообщение от grizlik78 Посмотреть сообщение
Только это же можно сказать и про классы, и про C++, и про компьютер...
смело подписываюсь рядом.
0
LosAngeles
Заблокирован
31.07.2011, 19:07  [ТС] #33
Цитата Сообщение от novi4ok Посмотреть сообщение
золотые слова! расскажу историю из практики. получила наша фирма как-то проект большой, сроки были сжатые очень, пригласили двоих экстернов на год. один из них решил кое-что "автоматизировать". месяца два что-то варил, как оно работает, никому объяснить не сумел, сказал только, что "все это очень сложно" и "оно все правильно работает". смотреть вовнутрь было страшно, но все и старись не смотреть. оно действительно как-то работало. проследить как - ни в дибаггере ни по записям в логи было невозможно. по крайней мере понять почему так и какую-то найти логику.
и так было, пока вдруг не стала проявляться с устойчивой регулярностью ошибка. гений уже у нас не работал, дали одному разобраться и исправить. через неделю он сказал, что может только все это заново написать. дали второму, через пару дней заявил то же самое. я вообще отказался вовнутрь смотреть. практически весь код содержится в *.h файлах и выглядит не то что непривычно, а вообще не как код. что-то подобное я видел, когда разбирался с какими-то файлами конфигурации в юниксе.
в общем, призвали гения обратно. он пришел, попялился до обеда в свои буковки, извинился и тихо ушел. когда встречаешь на улице - отводит глаза, делает вид, что не узнал.
в конце-концов переписал негений всю эту кухню, и все опять работает. и без ошибок. и если поменять что-то нужно - любому скажи, полезет, разберется и поменяет.
кстати, экзешник после того как переписали, стал раз в 10 короче. у гения был задумано так, что на каждый пук создавался по его темплейтам новый класс, содержащий поля, которые в свою очередь создавались по темплейтам, которые ...
а эта правдивая история относится как то к теме или вобще шаблонам? Если этот программист написал чё то через жопу, то это лично его и вашей фирмы проблемы, а не шаблонов или языка или ещё чего
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.07.2011, 19:30 #34
Цитата Сообщение от LosAngeles Посмотреть сообщение
а эта правдивая история относится как то к теме или вобще шаблонам? Если этот программист написал чё то через жопу, то это лично его и вашей фирмы проблемы, а не шаблонов или языка или ещё чего
твоя цитата?
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было передано в аргументах - класс или некласс.
ты тему открыл, вопрос задал. я мое мнение высказал: это - попытка сделать что-то через жопу с помощью шаблонов.
приведу аргумент, чтобы ты зря не обижался. потому что шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов. а ты пытаешься выкрутить руки этой концепции, и сделать различное поведение для различных типов. для решения таких задач не через жопу существуют другие концепции.
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
31.07.2011, 19:44 #35
Цитата Сообщение от novi4ok Посмотреть сообщение
потому что шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов. а ты пытаешься выкрутить руки этой концепции, и сделать различное поведение для различных типов.
Это в теории. А на практике это работает только в тривиальных случаях. Иначе бы не появилась возможность специализации шаблонов.
0
LosAngeles
Заблокирован
31.07.2011, 19:58  [ТС] #36
Цитата Сообщение от novi4ok Посмотреть сообщение
ты тему открыл, вопрос задал. я мое мнение высказал
я где то спрашивал твоё мнение? Я же сказал, что задача абстрактная и возможно не имеет применения, и ты при этом предъявляешь претензии, что задача бесполезная?
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.07.2011, 20:31 #37
Цитата Сообщение от novi4ok Посмотреть сообщение
шаблон по определению - нечто обобщающее для различных типов объектов. повторю: общее поведение для различных типов.
допустим..

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

Цитата Сообщение от novi4ok Посмотреть сообщение
для решения таких задач не через жопу существуют другие концепции.
например?
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
01.08.2011, 10:09 #38
novi4ok, Если не умеете пользоваться метапрограммированием на С++ - не стоит отговаривать других. Это бывает как минимум интересно, а так же бывает (хоть и редко) полезно.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2011, 10:37 #39
изнасиловать можно любую парадигму. и даже оргазм при этом испытать. но задачи таким образом решать - извращение.
0
LosAngeles
Заблокирован
01.08.2011, 11:07  [ТС] #40
Цитата Сообщение от novi4ok Посмотреть сообщение
но задачи таким образом решать - извращение
ааа то есть задача нормальная, а решение которое предложил grizlik78 тебе не нравится? ну так ты покажи своё мы все полюбуемся. С умным видом орать, что всё вокруг говно любой дурак сможет
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2011, 11:30 #41
Цитата Сообщение от LosAngeles Посмотреть сообщение
ааа то есть задача нормальная, а решение которое предложил grizlik78 тебе не нравится? ну так ты покажи своё мы все полюбуемся. С умным видом орать, что всё вокруг говно любой дурак сможет
решай как считаешь правильным.
0
LosAngeles
Заблокирован
01.08.2011, 11:44  [ТС] #42
ясно, значит пришёл, нагадил и на попятный сразу, если бы ты был супергероем, тебя бы звали Капитан Гонор
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 11:52 #43
novi4ok, я тебе задал прямой вопрос. а ты просто трепишься..
0
Mr.X
Эксперт С++
3059 / 1704 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2011, 12:11 #44
А у меня что-то в VS2008 код от grizlik78 из сообщения #20 не компилируется, выдает ошибку
error C2783: 'IsClassT<T>::Two IsClassT<T>::test(...)' : could not deduce template argument for 'C'
как и код, приведенный в цитируемой книжке:
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
/////////////////////////////////////////////////////////////////////////////////////////
#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<class T>
void  check()
{ 
    std::cout << (IsClassT<T>::Yes ? "IsClassT" : "!IsClassT")
              << std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
template<class T>
void  check_T(T)
{
    check<T>();
}
/////////////////////////////////////////////////////////////////////////////////////////
class A
{};
///////////////////////////////////////////////////////////////////////////////////////// 
int main()
{
    A a;
    check_T(5);
    check_T(a);
}
Т.е. данная студия не соответствует стандарту?
0
LosAngeles
Заблокирован
01.08.2011, 12:16  [ТС] #45
попробуй заменить 14 на
C++
1
enum { Yes = sizeof(test<T>(0)) == 1 };
0
01.08.2011, 12:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 12:16
Привет! Вот еще темы с ответами:

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


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

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

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