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

непонятная конструкция, шаблоны - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
LosAngeles
Заблокирован
30.07.2011, 17:28     непонятная конструкция, шаблоны #1
столкнулся со странной конструкцией
C++
1
template<typename C> static One test(int C::*);
в
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 };
};
в упор не понимаю, что значит int C::*
видел объяснения на русском, на инглише, что это мол какой-то указатель на член, всё равно не догоняю. Может кто-нибудь доходчиво объяснить или хотя привести примеры зачем это нужно ну кроме как здесь? Всё остальное понятно, мне бы этот момент главное прояснить. Заранее спасибо
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2011, 17:28     непонятная конструкция, шаблоны
Посмотрите здесь:

C++ Конструкция if..
C++ конструкция
C++ Конструкция
Что за конструкция? C++
C++ шаблоны классов: непонятная ошибка в одном из методов класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
31.07.2011, 07:25  [ТС]     непонятная конструкция, шаблоны #21
туплю наверно. Не понимаю ты о чём?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 07:36     непонятная конструкция, шаблоны #22
Цитата Сообщение от LosAngeles Посмотреть сообщение
туплю наверно. Не понимаю ты о чём?
Почему бы не передавать указатель на шаблонный тип Т, вместо указателя на шаблонное поле Т класса С? Т.е. я просто не могу понять разницы, кроме более сложной и запутанной записи. Хочу, чтобы мне объяснили разницу.)

Добавлено через 2 минуты
Т.е. я вообще смысла понять не могу. С методом понятно, я передал указатель на метод и вызываю его для различных объектов. Как-бы настройка поведения. Но зачем это делать с полем? Т.е. можно передать смещение поля в классе, а потом обращаться к этому полю для всех объектов. Это понятно. Но зачем???
LosAngeles
Заблокирован
31.07.2011, 07:48  [ТС]     непонятная конструкция, шаблоны #23
имеешь ввиду что это лишние template<typename C>? я тоже задался вопросом нафиг, попытался убрать, но компилятор ломанулся инстанцировать первый вариант и для инт. Впринципе логично, в объявлениях компилятор должен подставить Т, но в случае с интом это не получается. А если методы делать шаблонными, то он доходит до 10 строки и только тогда ломится подставлять один вариантов и подставляет наиболее подходящий
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 07:49     непонятная конструкция, шаблоны #24
Я имею в виду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 template< class T >
  T& IncrementIntegerElement( int * Element )
  {
   *Element += 1;
    return Object;
  }
 
  template< class T >
  T IncrementMyClassElement( T * Element )
  {
   *Element += 1;
    return *Element;
  }
LosAngeles
Заблокирован
31.07.2011, 08:06  [ТС]     непонятная конструкция, шаблоны #25
вобщем я не понимаю что ты хочешь сделать, наверно ValeryLaptev или Kastaneda придут и разберутся
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
31.07.2011, 09:38     непонятная конструкция, шаблоны #26
Так:
C++
1
 template<typename C> static One test(int C::*);
мы получаем тип С, который очевидно потребуется в этой функции (можно создать объект С, можно вызвать статичную функцию из класса С, можно еще что-нибудь).
А так:
C++
1
2
3
4
 template<typename C> static One test(C *elem);
 
//или так
template<typename C> static One test(int *elem);
у нас не будет информации о классе, к которому относится переменная elem.

Вобщем подобная запись может понадобиться, если нам зачем-то нужен класс-владелец передоваемого члена.

Не по теме:

это единственное адекватное объяснение, которое пришло мне в голову

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 10:06     непонятная конструкция, шаблоны #27
Цитата Сообщение от Kastaneda Посмотреть сообщение
у нас не будет информации о классе, к которому относится переменная elem.
Вобщем подобная запись может понадобиться, если нам зачем-то нужен класс-владелец передоваемого члена.
Так вот в этом и вопрос! Переменную можно отредактировать просто передав. Если передан объект класса, то и переменную можно через объект получить.
Т.е. бессмыслица полная.(
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
31.07.2011, 10:17     непонятная конструкция, шаблоны #28
Ну С++ - язык богатых возможностей) Без реализации функции сложно сказать зачем понадобилась именно такая запись. Как вариант - передаем статичный член (не имея при этом созданного объекта), а внутри вызываем статичную функцию.
LosAngeles
Заблокирован
31.07.2011, 10:31  [ТС]     непонятная конструкция, шаблоны #29
пример же в шапке есть зачем это нужно. Если есть хотя бы одна ситуация, где можно применить некую конструкцию, значит она небесполезна?
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
31.07.2011, 10:41     непонятная конструкция, шаблоны #30
Цитата Сообщение от LosAngeles Посмотреть сообщение
столкнулся со странной конструкцией
C++
1
template<typename C> static One test(int C::*);
в
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 };
};
в упор не понимаю, что значит int C::*
видел объяснения на русском, на инглише, что это мол какой-то указатель на член, всё равно не догоняю. Может кто-нибудь доходчиво объяснить или хотя привести примеры зачем это нужно ну кроме как здесь? Всё остальное понятно, мне бы этот момент главное прояснить. Заранее спасибо
Наконец-то я понял, о чем речь. Пример этот - шаблон для определения на этапе компиляции, является ли тип T классом.
Объяснить, как работает - сложно. Надо медитировать на SFINAE.
Но суть в том, что при инстанцировании
C++
1
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
для класса инстанцируется One test, а для не класса - Two test именно потому, что у класса есть элементы, а у не класса - элементов нет.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
31.07.2011, 10:53     непонятная конструкция, шаблоны #31
А если кто всё-равно не понял, тот может попробовать запустить вот это:
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
#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 };
};
 
class A
{
    int a;
};
 
class B
{
    float b;
};
 
struct C
{
};
 
union D
{
};
 
#define IS_CLASS(x) \
    if (IsClassT<x>::Yes) \
        std::cout << #x " is class" << std::endl; \
    if (IsClassT<x>::No) \
        std::cout << #x " is not class" << std::endl; 
 
int main()
{
    IS_CLASS(A)
    IS_CLASS(B)
    IS_CLASS(C)
    IS_CLASS(D)
    IS_CLASS(int)
    IS_CLASS(float)
    return 0;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
31.07.2011, 10:54     непонятная конструкция, шаблоны #32
Спасибо, не знал о таком. Гугл говорит, что данный код взят из этой книги.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
31.07.2011, 11:01     непонятная конструкция, шаблоны #33
Kastaneda, совершенно верно. Книжку Шаблоны в С++ надо держать на столе всегда...
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
31.07.2011, 11:02     непонятная конструкция, шаблоны #34
Кому интересно, нашел эту книгу в переводе, в русском варианте она почему-то называется "Шаблоны C++. Справочник разработчика"
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
31.07.2011, 11:02     непонятная конструкция, шаблоны #35
grizlik78, спасибо за уточнение...
LosAngeles
Заблокирован
31.07.2011, 11:05  [ТС]     непонятная конструкция, шаблоны #36
Цитата Сообщение от Kastaneda Посмотреть сообщение
Кому интересно, нашел эту книгу в переводе, в русском варианте она почему-то называется "Шаблоны C++. Справочник разработчика"
ну да, я из неё и спёр этот пример. А что удивительного в том что она так называется?
Kastaneda
31.07.2011, 11:09
  #37

Не по теме:

Цитата Сообщение от LosAngeles Посмотреть сообщение
А что удивительного в том что она так называется
В оригинале она называется "C++ Templates - The Complete Guide", что можно перевести как "Шаблоны С++ - полное руководство", а у нас она издана как "... справочник разработчика".

ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
31.07.2011, 11:11     непонятная конструкция, шаблоны #38
Kastaneda, да. Именно она.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2011, 11:15     непонятная конструкция, шаблоны
Еще ссылки по теме:

Конструкция try . catch C++
C++ Интересная конструкция в C++
Конструкция в условии C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 11:15     непонятная конструкция, шаблоны #39
По моему, в boost есть type_traits для этого.)
Yandex
Объявления
31.07.2011, 11:15     непонятная конструкция, шаблоны
Ответ Создать тему
Опции темы

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