Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
xlxndr
57 / 9 / 3
Регистрация: 14.06.2013
Сообщений: 115
#1

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

14.01.2016, 16:48. Просмотров 222. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать функцию, которая тип данных использует как параметр? (C++):

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

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

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

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

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

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

6
GbaLog-
Любитель чаепитий
3030 / 1398 / 337
Регистрация: 24.08.2014
Сообщений: 4,966
Записей в блоге: 1
Завершенные тесты: 2
14.01.2016, 16:51 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 / 3
Регистрация: 14.06.2013
Сообщений: 115
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
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
14.01.2016, 17:05 #4
Вам просто нужно немного пересмотреть структуру своего приложения.
Сейчас Вы втыкаете костыли.
0
xlxndr
57 / 9 / 3
Регистрация: 14.06.2013
Сообщений: 115
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
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
14.01.2016, 21:30 #6
Цитата Сообщение от xlxndr Посмотреть сообщение
вот и ответ на вопрос...
только смещение будет не на кол-во байт, которое занимает DATA_TYPE, а на sizeof(DATA_TYPE) * sizeof(*ptrClass) ;
1
xlxndr
57 / 9 / 3
Регистрация: 14.06.2013
Сообщений: 115
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
Привет! Вот еще темы с ответами:

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

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

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

Как сделать функцию которая получает цифру и возвращает строку? - C++
Лучше всего наглядный пример, пожалуйста. :) Благодарю всех заранее.


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

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

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