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

универсальный указатель - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 22:46     универсальный указатель #1
Добрый вечер.
Можно ли создать шаблон, что бы не приводить явно универсальный указатель к определенному типу при разыменовании?
Или по крайней мене узнать тип (размер) данных которые хранятся по указанному адресу?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 22:46     универсальный указатель
Посмотрите здесь:

Специализация и обобщение в С++ через универсальный указатель C++
универсальный указатель C++
C++ Функция принимает указатель на void и возвращает указатель на int
C++ Как получить ссылку на указатель или указатель на указатель в массиве?
Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.02.2013, 22:47     универсальный указатель #2
нет, а зачем?
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 22:50  [ТС]     универсальный указатель #3
Kuzia domovenok, Что бы написать что то подобное:
C++
1
2
3
4
5
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return *(T*)pa * *(T*)pb * *(T*)pc;
}
Только тут ошибка, вместо (T*) мне нужно указать тип данных который содержит ячейка памяти...

Просто без этого я не вижу смысла в универсальном указателе....
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:02     универсальный указатель #4
Цитата Сообщение от fuelcs Посмотреть сообщение
Только тут ошибка, вместо (T*) мне нужно указать тип данных который содержит ячейка памяти...
Зачем?

C++
1
2
3
4
5
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return (*pa) * (*pb) * (*pc);
}
Это ли не то, чего хотел добиться?

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
    int a = 1;
    int b = 2;
    int c = 3;
    std:: cout << mult(&a,&b,&c) << std::endl;
 
    double aa = 1.1;
    double bb = 2.2;
    double cc = 3.3;
    std:: cout << mult(&aa,&bb,&cc) << std::endl;
Ну и пример использования. Или я неправильно понял проблему? Пиши, разберемся
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:02  [ТС]     универсальный указатель #5
ITcrusader, как зачем???
C++
1
2
3
4
5
...
int a,b,c;
void* pa=&a,*pb=&b,*pc=&c;
...
mult(pa,pb,pc)
указатель то универсальный...
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:08     универсальный указатель #6
Вот оно что) А может лучшее решение найдется после ответа на вопрос "А зачем?"
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:12  [ТС]     универсальный указатель #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return (*pa) * (*pb) * (*pc);
}
 
using namespace std;
 
int main()
{   
    int a,b,c;
    void* pa=&a,*pb=&b,*pc=&c;
    cin >> a;
    cin >> b;
    cin >> c;
    cout << "\n";
    cout << *(int*)pa << " * " << *(int*)pb << " * " << *(int*)pc << " = " << mult(pa,pb,pc) << "\n";
    cout << "\n";
 
    return 0;
}
если указатель про процессе работы будет указывать на разные типы данных...

Добавлено через 1 минуту
Цитата Сообщение от ITcrusader Посмотреть сообщение
"А зачем?"
а толку с универсального указателя, если что бы его разыменовать нужно указать тип?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.02.2013, 23:19     универсальный указатель #8
Цитата Сообщение от fuelcs Посмотреть сообщение
а толку с универсального указателя, если что бы его разыменовать нужно указать тип?
смотри сишные универсальные функции, использовавшиеся до шаблонов. qsort, memset, memcpy
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:22     универсальный указатель #9
Цитата Сообщение от fuelcs Посмотреть сообщение
void* pa=&a,*pb=&b,*pc=&c
Вот здесь вы теряете всю информацию о типах. А это очень плохо. Не надо использовать void* в плюсах, ведь практически всегда есть альтернативы.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:22     универсальный указатель #10
Ну, в общем, так. Использование указателей на void целесообразно в единичных случаях (и то, с целью лютой унификации и спрятано должно быть в недрах реализации), например, при создании контейнера и то требует надстройки интерфейса над этим ночным кошмаром, который будет осуществлять строгий контроль типов. Я, может, это от безысходности пишу)) Но батьки так советуют (Мейерс, Скотт).
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.02.2013, 23:25     универсальный указатель #11
Цитата Сообщение от diagon Посмотреть сообщение
Не надо использовать void* в плюсах, ведь практически всегда есть альтернативы.
а как же qsort, memset memcpy и прочий stdlib.h???
fuelcs
24.02.2013, 23:28  [ТС]
  #12

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
memset
можно пример связки memset и void* ?

diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:29     универсальный указатель #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
qsort
Он гораздо медленнее std::sort как раз-таки из-за того, что не имеет информации о типах и не может инлайнить вызов функции сравнения.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
memset memcpy
Это вообще сишные POD'овые функции, написать с ними что-либо универсальное невозможно.

А вообще, реализация из #4 полностью универсальна(только непонятно, на кой там нужны указатели) и вызывать ее можно для любых типов. Ну а если пользователь этой функции не знает, какие у него типы (то есть передает void*) то это его проблемы, что мы не оправдали его ожидания.
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:39  [ТС]     универсальный указатель #14

Не по теме:

C++
1
2
3
4
5
6
7
8
const int n=10;
    int arr [n];
    memset(arr,10,sizeof(arr));//почему это не работает?
    memset(arr,0,sizeof(arr));// а это работает?
    for (int i=0;i<n;i++)
    {
        cout << arr[i] << " ";
    }
memset(arr,10,sizeof(arr)); - в чем ошибка ?



выше сказанное связано с темой?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.02.2013, 23:41     универсальный указатель #15
Цитата Сообщение от fuelcs Посмотреть сообщение
можно пример связки memset и void* ?
обнулить участок памяти, начиная с некоего адреса. (Из чьей-то лабы драйвера экрана)
C++
1
2
3
4
5
6
7
#define VIDEO_WIDTH 80    //ширина экрана
#define VIDEO_HEIGHT 25   //высота экрана
#define VIDEO_RAM 0xb8000 //адрес видеопамяти
void clear()//Очистка экрана
{
 memset(VIDEO_RAM, 0, VIDEO_WIDTH*VIDEO_HEIGHT);
}
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:45  [ТС]     универсальный указатель #16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Код C++
#define VIDEO_WIDTH 80 * *//ширина экрана
#define VIDEO_HEIGHT 25 * //высота экрана
#define VIDEO_RAM 0xb8000 //адрес видеопамяти
void clear()//Очистка экрана
{
*memset(VIDEO_RAM, 0, VIDEO_WIDTH*VIDEO_HEIGHT);
}
это код для консоли?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:47     универсальный указатель #17
Цитата Сообщение от fuelcs Посмотреть сообщение
выше сказанное связано с темой?
Если вы про мой пост, то напрямую.
Ибо void* - просто адрес чегототам в памяти и вытащить из этого адреса тип невозможно.
Ну, можно использовать ваш код из #2, но для этого вызывающей стороне придется явно указать желаемый тип
C++
1
2
3
4
5
...
int a,b,c;
void* pa=&a,*pb=&b,*pc=&c;
...
mult<int>(pa,pb,pc)
Но так делать не нужно.
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:49  [ТС]     универсальный указатель #18
diagon, я имел ввиду свой код с memset...
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:58     универсальный указатель #19
Цитата Сообщение от fuelcs Посмотреть сообщение
memset(arr,10,sizeof(arr));//почему это не работает?
Потому что оно каждому байту (не int'у, а именно байту) присвоит значение 10.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 00:09     универсальный указатель
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
25.02.2013, 00:09  [ТС]     универсальный указатель #20
diagon, исходя из
Цитата Сообщение от diagon Посмотреть сообщение
Потому что оно каждому байту (не int'у, а именно байту) присвоит значение 10.
и
Цитата Сообщение от diagon Посмотреть сообщение
вытащить из этого адреса тип невозможно
я думаю что ячейка памяти просто набор (к примеру) из 32 бит и при
C++
1
2
3
short a=7;
short* b=&a;
cout << *b;
именно при
C++
1
*b
мы извлекаем с памяти нужные биты тоесть 0000 0000 0000 0111 ?

Я правильно понимаю?
Yandex
Объявления
25.02.2013, 00:09     универсальный указатель
Ответ Создать тему
Опции темы

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