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

вопрос по синтаксису/типам - C++

Восстановить пароль Регистрация
 
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
01.11.2011, 11:01     вопрос по синтаксису/типам #1
фрагмент файла unique_ptr.h:
C++
1
2
3
4
5
6
7
  template <typename _Tp, typename _Tp_Deleter = default_delete<_Tp> > 
    class unique_ptr
    {
      typedef std::tuple<_Tp*, _Tp_Deleter>  __tuple_type;
      typedef __tuple_type unique_ptr::*     __unspecified_bool_type;
      typedef _Tp* unique_ptr::*             __unspecified_pointer_type;
      ....
Вот со строчкой
C++
1
typedef std::tuple<_Tp*, _Tp_Deleter>  __tuple_type;
все понятно, __tuple_type, значит, будет отныне синонимом для шаблонного класса std::tuple<_Tp*, _Tp_Deleter>, который уже где-то в стандартных хедерах был определен. А вот что означают две следующие строки
C++
1
2
typedef __tuple_type unique_ptr::*     __unspecified_bool_type;
typedef _Tp* unique_ptr::*             __unspecified_pointer_type;
я что-то понять не могу, что за тип такой __tuple_type unique_ptr::* или _Tp* unique_ptr::* ? То есть, это какой-то совершенно неведомый мне раздел синтаксиса языка, я прежде никогда не слышал о таких синтаксических конструкциях. Рад был бы погуглить, но даже не представляю, что здесь гуглить.
Подскажите, знающие люди.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2011, 11:01     вопрос по синтаксису/типам
Посмотрите здесь:

C++ Вопрос по синтаксису С++
Теория по абстрактным типам данных C++
C++ вопрос по типам даных
Перегрузка операции индексирования, вопрос по синтаксису C++
C++ Вопрос по синтаксису
Вопрос по синтаксису языка C++
C++ Вопрос по типам
Пояснение по синтаксису C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
01.11.2011, 17:08     вопрос по синтаксису/типам #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от yekka Посмотреть сообщение
я что-то понять не могу, что за тип такой __tuple_type unique_ptr::* или _Tp* unique_ptr::* ?
Это указатель на член класса. Простой пример
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 <string>
 
struct A
{
    int i;
    std::string s;
};
 
int main()
{
    typedef int A::* i_ptr;
    typedef std::string A::* s_ptr;
 
    i_ptr p1 =  &A::i;
    s_ptr p2 =  &A::s;
 
    A a = {1, "text"};
 
    std::cout << a.*p1 << '\n';
    std::cout << a.*p2 << '\n';
 
    return 0;
}
Ну и немного более сложный пример 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
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
65
66
#include <iostream>
#include <string>
#include <functional>
#include <algorithm>
 
// функтор
template
<
    typename StructType,
    typename MemberType
>
class StructMemberLessCmp : std::binary_function<StructType, StructType, bool>
{
    private:
        typedef MemberType StructType::* member_ptr_type;
 
 
    private:
        member_ptr_type p_;
 
    public:
        StructMemberLessCmp(member_ptr_type p)
            : p_(p)
        {
        }
 
        bool operator()(const StructType &a, const StructType& b) const
        {
            return a.*p_ < b.*p_;
        }
};
 
//---------------
 
struct A
{
    int i;
    std::string s;
};
 
int main()
{
    const size_t n = 5;
    A a[n] =
    {
        {1, "a"},
        {4, "c"},
        {2, "d"},
        {5, "b"},
        {3, "e"}
    };
 
    // сортируем массив структур по полю int i и выводим на экран
    std::sort(a, a + n, StructMemberLessCmp<A, int>(&A::i));
    for(size_t i = 0; i < n; ++i)
        std::cout << a[i].i << ' ' << a[i].s << '\n';
    std::cout << '\n';
 
    // сортируем массив структур по полю std::string s и выводим на экран
    std::sort(a, a + n, StructMemberLessCmp<A, std::string>(&A::s));
    for(size_t i = 0; i < n; ++i)
        std::cout << a[i].i << ' ' << a[i].s << '\n';
    std::cout << '\n';
 
    return 0;
}
Добавлено через 3 часа 2 минуты
Забыл указать public при наследовании
C++
1
class StructMemberLessCmp : public std::binary_function<StructType, StructType, bool>
Yandex
Объявления
01.11.2011, 17:08     вопрос по синтаксису/типам
Ответ Создать тему
Опции темы

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