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

шаблоны

31.07.2011, 11:36. Показов 5464. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.07.2011, 11:36
Ответы с готовыми решениями:

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

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

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

61
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2011, 11:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от LosAngeles Посмотреть сообщение
ааа то есть задача нормальная, а решение которое предложил grizlik78 тебе не нравится? ну так ты покажи своё мы все полюбуемся. С умным видом орать, что всё вокруг говно любой дурак сможет
решай как считаешь правильным.
0
Заблокирован
01.08.2011, 11:44  [ТС]
ясно, значит пришёл, нагадил и на попятный сразу, если бы ты был супергероем, тебя бы звали Капитан Гонор
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 11:52
novi4ok, я тебе задал прямой вопрос. а ты просто трепишься..
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2011, 12:11
А у меня что-то в 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
Заблокирован
01.08.2011, 12:16  [ТС]
попробуй заменить 14 на
C++
1
enum { Yes = sizeof(test<T>(0)) == 1 };
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.08.2011, 12:19
Mr.X, да я в VS2008 тоже пробовал. Проблема у неё с IsClassT. На счёт стандарта не уверен, но похоже.

Добавлено через 1 минуту
Цитата Сообщение от LosAngeles Посмотреть сообщение
попробуй заменить 14 на
Ага, так работает.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2011, 12:22
Цитата Сообщение от LosAngeles Посмотреть сообщение
попробуй заменить 14 на
C++
1
enum { Yes = sizeof(test<T>(0)) == 1 };
Мда, а я почему-то посчитал, что люди это уже скомпилировали, поэтому и не вглядывался особо...
0
Заблокирован
01.08.2011, 12:31  [ТС]
ещё, если добавить template должно работать
enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == 1 };
глава 5 5.1 в книге по шаблонам.

Не по теме:

После выхода стандарта придётся покупать новое издание, много чего можно переработать, многие ограничения шаблонов функций вроде обещали убрать + decltype неплохо бы упомянуть в главе про promotionTraits, хотя это только для встроенных типов замена, auto и ещё много всякого добра...

0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.08.2011, 12:59
Цитата Сообщение от Mr.X Посмотреть сообщение
Мда, а я почему-то посчитал, что люди это уже скомпилировали, поэтому и не вглядывался особо...
Ну я компилировал. В GCC. В нём исходный вариант без проблем.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 13:09
Цитата Сообщение от LosAngeles Посмотреть сообщение
decltype неплохо бы упомянуть в главе про promotionTraits, хотя это только для встроенных типов замена
ложь.
что за книга?

Добавлено через 2 минуты
пример:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <string>
#include <vector>
#include <iostream>
 
int main() {
   std::vector<std::string> vs{"1", "2"}; // initializer list
   decltype(vs) vs2 = vs; // decltype
   for ( auto it: vs2 ) { // range-based for
      std::cout << it << std::endl;
   }
}
http://liveworkspace.org/code/... 3ec9fa0896
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.08.2011, 13:13
Цитата Сообщение от LosAngeles Посмотреть сообщение
ещё, если добавить template должно работать
enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == 1 };
глава 5 5.1 в книге по шаблонам.
а вот добавление ::template на результат не влияет. MSVC2008 по прежнему не переваривает код, а GCC4.5.1 переваривает. Так что без IsClassT<T>:: получился более универсальный вариант. У меня он на 2 компиляторах работает
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 13:16
Цитата Сообщение от grizlik78 Посмотреть сообщение
У меня он на 2 компиляторах работает
оно и должно работать. не знаю что за MSVC2008..
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.08.2011, 13:20
Цитата Сообщение от niXman Посмотреть сообщение
не знаю что за MSVC2008..
Microsoft Visual C++ 2008
0
Заблокирован
01.08.2011, 13:21  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
ложь.
что за книга?
А как с decltype можно решить какой тип сильнее не для встроенных типов? Что-то я не вижу решения. Да и для встроенных если взять decltype от суммы инта и дабла, он же вернёт дабл. А ведь не факт что сильный тип это тот, который вместительней, может кто-то захочет из чара и дабла продвинуть чар?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 13:23
Microsoft Visual C++ 2008
где-то слышал про такое...

Добавлено через 47 секунд
Цитата Сообщение от LosAngeles Посмотреть сообщение
какой тип сильнее
это как?

Добавлено через 1 минуту
LosAngeles, все что я хотел сказать тем комментом - что в книге написана ложь про decltype.
0
Заблокирован
01.08.2011, 13:27  [ТС]
судя по примеру ты прочитал так:
decltype
cut
неплохо бы упомянуть в главе про promotionTraits, хотя это
только для встроенных типов замена
что конечно не верно
потому что пример ни о чём про продвижение типов мне не сказал

Добавлено через 2 минуты
это не в книге написано, это моё личное соображение, вполне вероятно я ошибаюсь, но пока я не вижу как decltype решает проблему выбора более сильного типа. Только для встроенных и только на основании размера этих типов, что не есть гибко
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.08.2011, 13:31
Цитата Сообщение от LosAngeles Посмотреть сообщение
продвижение типов
а это что?

Добавлено через 43 секунды
Цитата Сообщение от LosAngeles Посмотреть сообщение
выбора более сильного типа.
это что такое?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
01.08.2011, 13:31
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну я компилировал. В GCC. В нём исходный вариант без проблем.
Т.е. мой вопрос о несоответствии MSVS 2008 стандарту остается в силе?
А MSVS 2010 компилирует?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.08.2011, 13:43
Цитата Сообщение от Mr.X Посмотреть сообщение
Т.е. мой вопрос о несоответствии MSVS 2008 стандарту остается в силе?
А MSVS 2010 компилирует?
2010 у меня нет. А про стандартность мне трудно ответить. Статическая функция класса вызывается внутри определения класса, так что IsClassT<T>:: вроде как не нужен. А вот не нужен или не обязателен, это я не возьмусь утверждать.

Добавлено через 6 минут
Цитата Сообщение от niXman Посмотреть сообщение
продвижение типов
а это что?
Type promotion, видимо. Или это тоже непонятно?
0
Заблокирован
01.08.2011, 13:45  [ТС]
C++
1
2
3
4
5
template<typename T, typename U>
auto myFunc(T t, U u) -> decltype (t + u) 
{ 
     return t + u.; 
};
без decltype и auto возник бы вопрос возвращать T или U, а decltype продвинет более сильный тип. Возможно большинство устраивает, что он автоматом из дабла и инта выберет дабл. А возможно потребуется обратная ситуация, то тут он не поможет. А для пользовательских типов совсем не поможет?

Вандервурд и Джосатис называют это PromotionTraits ну или по русски это буквально значит свойство продвижение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.08.2011, 13:45
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru