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

Специализация и обобщение в С++ через универсальный указатель - C++

Восстановить пароль Регистрация
 
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
10.03.2012, 11:37     Специализация и обобщение в С++ через универсальный указатель #1
Здравствуйте, уважаемые участники форума!

Возникла следующая проблема. Необходимо написать обобщение, построенное на основе косвенного указателя void*. Поясню подробнее.

Я сумел сделать так. Имеется какая-то структура, обобщающая типы данных:

C++
1
2
3
4
5
6
7
8
9
struct data
 
{
enum htype {cl, pr};
htype k; // ключ
 
union type {club cl, priv pr};
type t; // здесь club и priv - определенные ранее типы, t - тип обобщения.
}
затем программа работала нормально, использовался какой-нибудь тип контейнера, к примеру линейный однонаправленный список:

C++
1
2
3
4
5
struct spisok
{
spisok *next; // указатель на следующий элемент
data d;
}
В процессе считывания данных с клавиатуры, к примеру, для начала считывался ключ k, а затем в зависимости от ключа предлагалось пользователю ввести данные для альтернатив:

C++
1
2
3
4
5
6
7
8
switck (k):
case 0:
{
cin>>nov->d.t.cl;
}
case 1:
cin>>nov->d.t.pr;
}
где nov - это элемент нашего линейного списка.

Таким образом было построено обобщение. Теперь задание - построить обобщение через косвенное связывание через указатель void*. Разбирался, разбирался, не понял ничего. Буду благодарен за любую помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
10.03.2012, 12:51     Специализация и обобщение в С++ через универсальный указатель #2
qwrus, такое актуально только в С. В С++ это решается с помощью шаблонов и/или наследования. Я так понял, тебе нужно сделать гетерогенный список?

Вот пример:
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
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <list>
#include <memory>
 
class Base
{
public:
    virtual void do_something() = 0;
};
 
class DerivedA: public Base
{
public:
    DerivedA(int i)
    : _i(i)
    {
    }
 
    void do_something()
    {
    std::cout << "DerivedA: " << _i << std::endl;
    }
private:
    int _i;
};
 
class DerivedB: public Base
{
public:
    DerivedB(double d)
    : _d(d)
    {
    }
    
    void do_something()
    {
    std::cout << "DerivedB: " << _d << std::endl;
    }
private:
    double _d;
};
    
int main()
{
    std::list<std::shared_ptr<Base> > list;
 
    for(size_t i = 0; i < 5; ++i)
    {
    int i;
 
    std::cin >> i;
 
    if(i)
    {
        int j;
        std::cin >> j;
 
        std::shared_ptr<Base> ptr(new DerivedA(j));
        
        list.push_back(ptr);
    }
    else
    {
        double d;
        std::cin >> d;
 
        std::shared_ptr<Base> ptr(new DerivedB(d));
        
        list.push_back(ptr);
    }
    }
 
    for(const std::shared_ptr<Base>& ptr: list)
    {
    ptr->do_something();
    }
}
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
11.03.2012, 10:45  [ТС]     Специализация и обобщение в С++ через универсальный указатель #3
Nameless One, беда в том, что преподавателю требуется именно указатель void*. Предмет - технологии программирования, отрабатываем различные методы организации данных.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
11.03.2012, 11:34     Специализация и обобщение в С++ через универсальный указатель #4
Nameless One, чем boost::any не подходит?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
11.03.2012, 11:34     Специализация и обобщение в С++ через универсальный указатель #5
go, тем, что его нет в стандарте. Ну и еще тем, что задание явно учебное.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
12.03.2012, 10:39     Специализация и обобщение в С++ через универсальный указатель #6
Цитата Сообщение от Nameless One Посмотреть сообщение
тем, что его нет в стандарте.
Некоторые программисты считают его стандартом де-факто и необходимым дополнением к STL.

Цитата Сообщение от Nameless One Посмотреть сообщение
Ну и еще тем, что задание явно учебное.
Так реализовать его не так и сложно. Вот готовый Задачи для тренировки и лучшего понимания
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 10:59     Специализация и обобщение в С++ через универсальный указатель #7
go, Я бы сказал большинство программистов. И из буста многое перелетает в стандарт.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
12.03.2012, 12:55     Специализация и обобщение в С++ через универсальный указатель #8
go, ForEveR, вы это потом его преподавателю объясняйте, почему он не сделал свой велосипед, а воспользовался нестандартной библиотекой
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2012, 13:00     Специализация и обобщение в С++ через универсальный указатель
Еще ссылки по теме:

Универсальный указатель или универсальный скалярный тип C++
Быстрее ли вывов функции, переданной через параметр шаблона, чем через простой указатель на функцию? C++
C++ Двумерный массив через указатель

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 13:00     Специализация и обобщение в С++ через универсальный указатель #9
Nameless One, А никто ведь не просит человека нести сразу преподавателю. Дали тебе пример, сделанный через any - смотришь на реализацию any и делаешь свой велосипед...
Yandex
Объявления
12.03.2012, 13:00     Специализация и обобщение в С++ через универсальный указатель
Ответ Создать тему
Опции темы

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