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

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

Войти
Регистрация
Восстановить пароль
 
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
#1

шаблон функции - C++

13.07.2010, 18:35. Просмотров 863. Ответов 17
Метки нет (Все метки)

Здрасти. Как правильно написать шаблон ,например, этой функции?

C++
1
2
3
4
5
6
int **newmatrix(int row, int col){
    int **matrix=new int*[row];
    for (int i=0; i<row; ++i)
        matrix[i]=new int[col];
    return matrix;
}
я сделал так:
C++
1
2
3
4
5
6
7
template <typename T>
T **newmatrix(int row, int col){
    T **matrix=new T*[row];
    for (int i=0; i<row; ++i)
        matrix[i]=new T[col];
    return matrix;
}
компилятор наругался на эту строку
C++
1
T **newmatrix(int row, int col){
... заменил ее на
C++
1
T **newmatrix(T row, T col){
и все заработало.
но если у меня будет матрица типа float, то row и col тоже будут float, а это же неверно

Как сделать правильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2010, 18:35     шаблон функции
Посмотрите здесь:

C++ Шаблон функции
Шаблон функции C++
Шаблон функции C++
шаблон функции C++
C++ Шаблон функции
C++ Шаблон функции
C++ c++ шаблон функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5767 / 3416 / 255
Регистрация: 08.02.2010
Сообщений: 7,441
13.07.2010, 19:06     шаблон функции #2
Указывай специализацию шаблона при вызове функции:
C++
1
double** matrix=newmatrix<double>(4, 6);
Добавлено через 3 минуты
Сопоставление между вызовом и объявлением шаблона осуществляется по аргументам функции, а не по возвращаемому значению, поэтому в данном случае специализация шаблона необходима. А в следующем примере она необязательна:
C++
1
2
3
4
5
6
7
8
template<class T>
T foo(T a, T b)
{
    //...
}
//...
int x=4, y=5;
int z=foo(x, y);
Добавлено через 3 минуты
Однако, к аргументам функций, тип которых определяется параметром шаблона, не применяются стандартные преобразования. Т.о., если переменные x и y в приведенном примере будут разных типов, то опять же нужно будет явно указывать специализацию шаблона при вызове функции, либо провести явное преобразование одного аргумента к типу другого.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.07.2010, 00:40     шаблон функции #3
Nameless One, будут разных типов, то опять же нужно будет явно указывать специализацию шаблона при вызове функции, либо провести явное преобразование одного аргумента к типу другого.
А написать

C++
1
2
template<class T1, class T2>
T2 foo(T1 a, T2 b)
Не подойдет?
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 00:46  [ТС]     шаблон функции #4
Цитата Сообщение от Lavroff Посмотреть сообщение
Не подойдет?
я так пробовал, - не работает
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.07.2010, 00:47     шаблон функции #5
PointsEqual, Странно. Для разных типов данных должно бы... Например int и float...
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 00:56     шаблон функции #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T> 
T ** create(size_t Rows, size_t Cols)
{
    T ** m = 0;
    return m;
}
 
int main() 
{
    int n = 5, m = 5;
    float ** matrix = create<float>(n, m);
}
Ошибок не замечено
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:09  [ТС]     шаблон функции #7
Цитата Сообщение от fasked Посмотреть сообщение
float ** matrix = create<float>(n, m);
ошибок нет, да.
но вот
C++
1
create<float>(n, m);
значит что n и m - вещественные? хотя объявлены как целые.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 01:12     шаблон функции #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
значит что n и m - вещественные? хотя объявлены как целые.
Нет, для них явно указан тип size_t, типом float будут только те переменные, которые созданы как T
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:15  [ТС]     шаблон функции #9
fasked, спасибо, дошло.

Еще на счет size_t- его где следует применять?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 01:18     шаблон функции #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
Еще на счет size_t- его где следует применять?
size_t - это синоним unsigned int. название говорящее, применяется обычно для обозначения длин, размеров, и всего подобного, что не может быть отрицательным по определению. функция strlen возвращает значение size_t.
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:24  [ТС]     шаблон функции #11
и если я буду тип счетчика делать size_t , то это корректно будит.?
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
14.07.2010, 01:27     шаблон функции #12
корректно, но без фанатизма, есть ведь просто unsigned
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 01:28     шаблон функции #13
Цитата Сообщение от PointsEqual Посмотреть сообщение
и если я буду тип счетчика делать size_t , то это корректно будит.?
предупреждения задолбали? xD
да, конечно, ничего страшного, ведь счетчик у тебя тоже не может принять отрицательных значений в данном случае. вообще корректно хотя бы потому что в int не влезет такое большое число как в size_t и счетчик должен быть такого же типа или больше
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:30  [ТС]     шаблон функции #14
Цитата Сообщение от fasked Посмотреть сообщение
предупреждения задолбали? xD
угу(

все, спасибо большое
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.07.2010, 01:33     шаблон функции #15
но все таки лучше последовать совету alex_x_x и для счетчика написать не size_t, а unsigned int.
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
14.07.2010, 12:12     шаблон функции #16
Хотелось бы узнать, по каким причинам лучше именно unsigned int. Потому что в моём представлении у size_t есть пара преимуществ:
а) применение этого типа для указания размеров и индексов позволяет более чётко выразить свой замысел и повысить читабельность программы;
б) этот тип автоматически адаптируется под 64-битную платформу, в отличие от имеющего фиксированный размер unsigned int.
Nameless One
Эксперт С++
5767 / 3416 / 255
Регистрация: 08.02.2010
Сообщений: 7,441
14.07.2010, 12:24     шаблон функции #17
Цитата Сообщение от PointsEqual Посмотреть сообщение
и если я буду тип счетчика делать size_t , то это корректно будит.?
Корректно, однако при работе с беззнаковым целым в качестве счетчика есть одна тонкость - следующий цикл правильно работать не будет, т.е. он будет бесконечным:
C++
1
2
for(size_t i=5; i>=0; --i)
        ;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2010, 13:01     шаблон функции
Еще ссылки по теме:

Переделать функции в шаблон C++
Шаблон функции C++
Шаблон функции C++
C++ Шаблон функции
Шаблон функции C++

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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
14.07.2010, 13:01     шаблон функции #18
Цитата Сообщение от PointsEqual Посмотреть сообщение
Как правильно написать шаблон ,например, этой функции?
Вообще не писать. Вообще. Никак.

Поскольку употребляется "шаблон", то это, без сомнения, C++. Функция, очевидно, будет употребляться для работы с матрицами. В идеологии С++ самое правильное, что можно сделать - это написать
C++
1
2
3
4
5
template<class T>
class Matrix
{
// тут реализация
};
и инкапсулировать всю необходимую функциональность (в том числе, создание, удаление и т.п.) в него. "Голые указатели" в С++ выглядят неестественно.
Yandex
Объявления
14.07.2010, 13:01     шаблон функции
Ответ Создать тему
Опции темы

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