Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 119
1

Как сделать функцию, которая тип данных использует как параметр?

14.01.2016, 16:48. Просмотров 864. Ответов 6
Метки нет (Все метки)

Хочу сделать функцию function("переменные", "тип данных"). Можно ли это реализовать?
А именно, более подробно что-то в этом роде:

C++
1
2
3
4
5
void Function(int n, Class* ptrClass, DATA_TYPE)
{
for(i=0;i<n;i++)
(ptrClass + sizeof(DATA_TYPE)) -> ClassMethod();
}
Т.е. нужно подставлять смещение в зависимости от DATA_TYPE - это размер одного экземпляра класса Class. ClassMethod - это один из описанных в Class методов.

Подскажите пожалуйста:
1) как использовать тип данных как аргумент
2) как реализовать такое смещение примере, аналогичном тому, что приведен.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2016, 16:48
Ответы с готовыми решениями:

Как создать функцию, которая определит с каким типом данных ей работать и подстроиться под этот тип?
например если мне нужно создать шаблон функции сортировки одномерных массивов произвольного типа)))

Как правильно создать шаблон на функцию, которая использует вектор?
есть вот такая шаблонная функция, template &lt;typename T&gt; void rev(const std::vector &lt;T&gt;...

Функция,которая определяет, встречается ли заданная буква, которая передается в функцию как параметр
Написать функцию, которая определяет, встречается ли заданная буква, которая передается в функцию...

Параметр шаблона класса как собственный тип данных
Приветствую. Такой вопрос: как перегрузить операторы класса-шаблона, где в качестве аргумента...

Создать функцию, которой строка передаётся как параметр, и которая возвращает количество слов
создать функцию в которой строка передаётся как аргумент и возвращает количество слов

6
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
14.01.2016, 16:51 2
Лучший ответ Сообщение было отмечено xlxndr как решение

Решение

C++
1
2
3
4
template<typename T1, typename T2, typename T3>
void f( T1 t1, T2 t2, T3 t3 ) {
    cout << sizeof(t1) << "\n" << sizeof(t2) << "\n" << sizeof(t3) << endl;
}
Может как-то так?
1
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 119
14.01.2016, 17:01  [ТС] 3
хм... к сожалению с созданием шаблонов еще не разобрался... надо поизучать этот вопрос... спасибо.
А в принципе, можно ли так задавать смещение, т.е. через ptr + sizeof(type) ?
Ну например, если есть массив типа char, то корректно ли такое:

C++
1
2
3
4
5
6
7
8
char M[10];
char* ptrM = M; //указатель на массив
 
for(i=0;i<10;i++)
{
    ptrM += sizeof(char);
    cout << "Символ номер " << i << " равен " << *ptr << endl;
}
???
0
Croessmah
++Ͻ
14611 / 8365 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
14.01.2016, 17:05 4
Вам просто нужно немного пересмотреть структуру своего приложения.
Сейчас Вы втыкаете костыли.
0
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 119
14.01.2016, 21:22  [ТС] 5
К сожалению эти рассуждения и начались с пересмотра структуры приложения, в котором были "простыни" из циклов... решил убрать их... сделать просто присваивание конкретного указателя на класс и метод... пока этот вариант кажется достаточно красивым, и отказываться от него не хотелось бы... Надеюсь, у кого-нибудь все же найдется готовый вариант решения подобной задачи...

Добавлено через 4 часа 3 минуты
вот и ответ на вопрос...

C++
1
2
3
4
5
6
template <class DATA_TYPE>
void Function(int n, Class* ptrClass, DATA_TYPE)
{
for(i=0;i<n;i++)
(ptrClass + sizeof(DATA_TYPE)) -> ClassMethod();
}
0
Croessmah
++Ͻ
14611 / 8365 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
14.01.2016, 21:30 6
Цитата Сообщение от xlxndr Посмотреть сообщение
вот и ответ на вопрос...
только смещение будет не на кол-во байт, которое занимает DATA_TYPE, а на sizeof(DATA_TYPE) * sizeof(*ptrClass) ;
1
xlxndr
57 / 9 / 4
Регистрация: 14.06.2013
Сообщений: 119
15.01.2016, 15:24  [ТС] 7
Спасибо, да... Я тут уже сам эмпирическим путем "выдавил" ответ на мой вопрос... И "исследование" показало следующее.

1) Действительно

C++
1
2
3
for(i=0;i<n;i++)
(ptrClass + i*sizeof(DATA_TYPE)) -> ClassMethod();
}
означает ни что иное, как

C++
1
2
3
for(i=0;i<n;i++)
(ptrClass + sizeof(ptrClass )*sizeof(DATA_TYPE)) -> ClassMethod();
}
Поэтому пришлось сделать "оптимизатор" в виде искуственно подставленного инкремента.

2) Если вы сделаете такую функцию и захотите чтобы она возвращала размер типа "типа", то вы ошибетесь, т.к. возвращать она будет размер указателя на класс (тип), а не размер класса (типа):

C++
1
2
3
4
5
template <class CLs2>
int GetShift(CLs2 tls)
{
    return sizeof(tls);
}
поэтому подобного рода конструкция должна быть изменена на

C++
1
2
3
4
5
template <class CLs2>
int GetShift(CLs2 tls)
{
    return sizeof(*tls);
}
Итоговая конструкция будет иметь вид:

C++
1
2
3
4
5
6
7
8
9
template <class DATA_TYPE>
void Function(int n, Class* ptrClass, DATA_TYPE)
{
for(i=0;i<n;i++)
{
int k = 0;
(ptrClass + k*sizeof(*DATA_TYPE)) -> ClassMethod();
k++;
}


Добавлено через 24 минуты
Кстати, удалось применить это для конкретных задач...

Почему без пустого поля типа "fignya" в базовом классе программа виснет?

Extra auqliication 'CLASS CONSTRUCTOR' and 'CLASS' has incomplete type. Что это?
0
15.01.2016, 15:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2016, 15:24

Создать функцию, которой строка передаётся как параметр, и которая возвращает количество слов
создать функцию в которой строка передаётся как параметр и возвращает колличество слов в этой строке

Написать функцию, которая зануляет массив переданный как параметр и возвращает кол-во отрицательных элементов до зануления?
Написать функцию, которая зануляет массив переданный как параметр и возвращает кол-во отрицательных...

Как правильно вызвать функцию с указателем на другую функцию как параметр
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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