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

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

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

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

30.07.2011, 17:28. Просмотров 2016. Ответов 38
Метки нет (Все метки)

столкнулся со странной конструкцией
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++
Задача создать шаблон двоичного дерева поиска. В методе удаления узла IntelliSense выдает ошибку: ссылается на if и пишет: &quot;требуется...

Конструкция - C++
ребят помогите разобрать конструкцию вида (ah==72)?k--:k; знаю что чтото логическое но вспомнить немогу:)

конструкция - C++
Доброго времени суток, с с++ мало знаком не могли бы пояснить некоторые моменты кода. #include &lt;math.h&gt; void tred2(float **a,...

Конструкция if.. - C++
Помогите пожалуйста довести задачу до конца! Дано натуральное число N. Если оно делится на 4, вывести на экран ответ N=4k (где k –...

Циклическая конструкция - C++
Не могу составить цикл для S = cos1*(cos1 + cos 2) * ... *(cos1+ cos 2 + ... + cos n)

Что за конструкция? - C++
Привет. Что за конструкция такая? Поясните что делает: for( int i=0;i&lt;N;++i ){ ++nCount; } f() - возвратит...

Не работает конструкция с new - C++
char**ex=new char*; for(i=0;i&lt;n;i++) ex=new char; for(i=0;i&lt;n;i++) cin&gt;&gt;ex; почему не работает

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
30.07.2011, 22:08     непонятная конструкция, шаблоны #16
Цитата Сообщение от LosAngeles Посмотреть сообщение
а что тогда можно присвоить р?
Сижу, методом тыка пытаюсь определить - это вообще что?
Арифметические операции к этому p не применяются (ошибка компиляции), оператор разыменования указателя тоже. Присвоить какое-то значение ему невозможно, если вывести это p, то выводится просто 1. Пробую вызывать ф-цию по-разному, не указатель на int, не указатель на функцию типа int(*)() в качестве аргумента неприемлемы (ошибка компиляции). Но сама строка:
C++
1
int C::*p;
компилируется нормально. Вообще странно.
P.S. у меня C - это просто класс.

Добавлено через 2 минуты
Да, оператор () тоже неподходит...

Добавлено через 45 минут
LosAngeles, вот нашел в википедии:
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
  class MyClass
  {
  public:
    int a;
  };
 
  template< class T >
  T& IncrementIntegerElement( int T::* Element, T& Object )
  {
    Object.*Element += 1;
    return Object;
  }
 
  template< class T >
  T IncrementMyClassElement( T MyClass::* Element, MyClass& Object )
  {
    Object.*Element += 1;
    return Object.*Element;
  }
 
  MyClass Obj;
  int n;
 
  n = ( IncrementIntegerElement( &MyClass::a, Obj ) ).a;
  n = IncrementMyClassElement( &MyClass::a, Obj );
Как и предполагалось, это просто указатель на член класса типа int, просто похоже подобная конструкция используется только с шаблонами (с простым классом некомпилируется).
Bers
Заблокирован
31.07.2011, 06:17     непонятная конструкция, шаблоны #17
Цитата Сообщение от Deviaphan Посмотреть сообщение
Только вот у ТС отсутствует список аргументов, при объявлении указателя на метод... Разве так можно?
2008 студия грязно выругалась.

А так, вапще, указатель на метод мне видится неким фейлом.
Попытка заюзать ООП в качестве функционального ЯП
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 07:04     непонятная конструкция, шаблоны #18
Цитата Сообщение от Bers Посмотреть сообщение
А так, вапще, указатель на метод мне видится неким фейлом.
Попытка заюзать ООП в качестве функционального ЯП
Не, не фэйл. Порекомендую ещё раз прочесть Александреску (если после прошлой рекомендации ещё не успели прочитать.) ) про функциональные объекты.


Цитата Сообщение от Kastaneda Посмотреть сообщение
Как и предполагалось, это просто указатель на член класса типа int,
Вероятно, так и есть. Но смысл действа не ясен. Почему там просто указатель на int не передаётся? Ничё не понятно... Если кто понял сакральный смысл этого действа, разъясните тугодуму, плиз.)
LosAngeles
Заблокирован
31.07.2011, 07:15  [ТС]     непонятная конструкция, шаблоны #19
если указатель на инт передавать, то первый вариант будет компилироваться всегда вне зависимости от Т вроде как
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 07:19     непонятная конструкция, шаблоны #20
Цитата Сообщение от LosAngeles Посмотреть сообщение
если указатель на инт передавать
Для второго варианта, указатель на Т передать.)
LosAngeles
Заблокирован
31.07.2011, 07:25  [ТС]     непонятная конструкция, шаблоны #21
туплю наверно. Не понимаю ты о чём?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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++
1286 / 1220 / 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
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 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++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.07.2011, 10:06     непонятная конструкция, шаблоны #27
Цитата Сообщение от Kastaneda Посмотреть сообщение
у нас не будет информации о классе, к которому относится переменная elem.
Вобщем подобная запись может понадобиться, если нам зачем-то нужен класс-владелец передоваемого члена.
Так вот в этом и вопрос! Переменную можно отредактировать просто передав. Если передан объект класса, то и переменную можно через объект получить.
Т.е. бессмыслица полная.(
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
31.07.2011, 10:17     непонятная конструкция, шаблоны #28
Ну С++ - язык богатых возможностей) Без реализации функции сложно сказать зачем понадобилась именно такая запись. Как вариант - передаем статичный член (не имея при этом созданного объекта), а внутри вызываем статичную функцию.
LosAngeles
Заблокирован
31.07.2011, 10:31  [ТС]     непонятная конструкция, шаблоны #29
пример же в шапке есть зачем это нужно. Если есть хотя бы одна ситуация, где можно применить некую конструкцию, значит она небесполезна?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2011, 10:41     непонятная конструкция, шаблоны
Еще ссылки по теме:

Не работает конструкция if else - C++
#include &lt;iostream&gt; using namespace std; void zeroSmaller(int&amp;, int&amp;); int main() { int number1, number2; ...

Конструкция в условии - C++
if(a==b==c==5) Такая конструкции будет работать без сбоев? А то компилятор делает предупреждение.

Интересная конструкция в C++ - C++
Добрый день. Подскажите пожалуйста, что это такое: float time = clock.getElapsedTime().asMicroseconds();

Неизвестная конструкция - C++
Задача поставлена так: Написать программу, переводящую арабские числа в римские. Задача упрощается тем, что можна считать, что 40=XXXX,...

Что за конструкция? - C++
что означает такая конструкция??? int *&amp;node


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

Или воспользуйтесь поиском по форуму:
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
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 именно потому, что у класса есть элементы, а у не класса - элементов нет.
Yandex
Объявления
31.07.2011, 10:41     непонятная конструкция, шаблоны
Ответ Создать тему
Опции темы

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