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

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

Восстановить пароль Регистрация
 
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
13.07.2010, 18:35     шаблон функции #1
Здрасти. Как правильно написать шаблон ,например, этой функции?

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, а это же неверно

Как сделать правильно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.07.2010, 00:40     шаблон функции #3
Nameless One, будут разных типов, то опять же нужно будет явно указывать специализацию шаблона при вызове функции, либо провести явное преобразование одного аргумента к типу другого.
А написать

C++
1
2
template<class T1, class T2>
T2 foo(T1 a, T2 b)
Не подойдет?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 00:46  [ТС]     шаблон функции #4
Цитата Сообщение от Lavroff Посмотреть сообщение
Не подойдет?
я так пробовал, - не работает
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.07.2010, 00:47     шаблон функции #5
PointsEqual, Странно. Для разных типов данных должно бы... Например int и float...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 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
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.07.2010, 01:12     шаблон функции #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
значит что n и m - вещественные? хотя объявлены как целые.
Нет, для них явно указан тип size_t, типом float будут только те переменные, которые созданы как T
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
14.07.2010, 01:15  [ТС]     шаблон функции #9
fasked, спасибо, дошло.

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

все, спасибо большое
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.07.2010, 01:33     шаблон функции #15
но все таки лучше последовать совету alex_x_x и для счетчика написать не size_t, а unsigned int.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
14.07.2010, 12:12     шаблон функции #16
Хотелось бы узнать, по каким причинам лучше именно unsigned int. Потому что в моём представлении у size_t есть пара преимуществ:
а) применение этого типа для указания размеров и индексов позволяет более чётко выразить свой замысел и повысить читабельность программы;
б) этот тип автоматически адаптируется под 64-битную платформу, в отличие от имеющего фиксированный размер unsigned int.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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++

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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
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     шаблон функции
Ответ Создать тему
Опции темы

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