С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Tawiskaron
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 2
1

Шаблон функции с разным возвращаемым типом

16.12.2011, 19:09. Просмотров 1203. Ответов 6
Метки нет (Все метки)

Доброго времени суток!
Возникла необходимость написать шаблон функции, которая будет возвращать значение, тип которого отличен от типа передаваемых параметров.
Конкретнее -- функция деления двух чисел.
Для параметров типа int возвращаемый тип должен быть float, а для типа long int -- double.
Подтолкните в нужном направлении, пожалуйста -)

Добавлено через 10 минут
Update
Я понимаю, что начать надо как-то так:


C++
1
2
3
4
5
template <typename T1, typename T2>
T2 division(T1 a, T1 b)
{
    return static_cast<T2>(a / b);
}
но как поставить соответствие между T1 и T2?
Или вообще все надо не так делать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2011, 19:09
Ответы с готовыми решениями:

независимо управлять типом входных данных массива для определения сред. ариф. и возвращаемым значением функции
Нужно сделать чтобы можно было независимо управлять типом входных данных...

Шаблон функции сортировки массива структур по разным типам полей
Делаю лабу. Вот текст задания. Считайте все записи из файла &quot;1.dat&quot;. Для...

В чем разница между типом функции и типом возвращаемого значения?
Читаю статью https:// code-live. ru/post/cpp-functions/ (ссылку изменил дабы...

Вычисление кубического корня с использованием функции с параметрами и возвращаемым значением
Составьте программу для вычисления кубического корня из произвольного числа...

Объявить прототип функции f1 с 2 аргументами-строками и возвращаемым результатом в виде литерного массива
Здрасте всем), есть такая задачка: Объявить прототип функции f1 с 2...

6
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
16.12.2011, 19:10 2
C++
1
2
3
4
5
6
7
8
9
10
11
float IntToFloat(int a, int b)
{
    if(b != 0)
    {
        float i = a;
        float j = b;
        return i / j;
    }
    else
        exit(1);
}
Ну на сколько я понял, то дело должно обстоять так, со стандартными типами.
На счет того что каким шаблоном заменить думай сам.
0
Tawiskaron
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 2
16.12.2011, 19:20 3
Цитата Сообщение от htonasral Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
float IntToFloat(int a, int b)
{
    if(b != 0)
    {
        float i = a;
        float j = b;
        return i / j;
    }
    else
        exit(1);
}
Ну на сколько я понял, то дело должно обстоять так, со стандартными типами.
На счет того что каким шаблоном заменить думай сам.
Увы, до этого я и сам могу додуматься. Меня интересует именно вопрос реализации шаблона.
0
LosAngeles
Заблокирован
16.12.2011, 19:27 4
это свойство продвижения типов promotion type traits, в книге джосатиса и вандервурда - шаблоны С++ справочник разработчика, оно подробно описано
0
ForEveR
В астрале
Эксперт С++
7997 / 4755 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.12.2011, 19:29 5
Tawiskaron,
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class T, class T2>
T2 division(const T& first, const T& second);
 
template<>
float division<int, float>(const int& first, const int& second)
{
}
 
template<>
double division<long int, double>(const long int& first, const long int& second)
{
}
м?
0
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
16.12.2011, 19:30 6
Ну исходя из моего примера выше можно сделать вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T1, typename T2>
T2 division(T1 a, T1 b)
{
    if(b != 0)
    {
        T2 i = a;
        T2 j = b;
        return i / j;
    }
    else
        exit(1);
}
Ну и использовать вот так:
C++
1
division<int, float>(3, 5);
0
LosAngeles
Заблокирован
16.12.2011, 20: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
24
25
26
27
28
29
30
31
32
33
34
template <bool b, typename T1, typename T2> struct ifTrueThenFirst;
 
template <typename T1, typename T2> struct ifTrueThenFirst<true, T1, T2>
{
    typedef T1 ResultT;
};
 
template <typename T1, typename T2> struct ifTrueThenFirst<false, T1, T2>
{
    typedef T2 ResultT;
};
 
template <typename T1, typename T2> struct Promotion
{
    typedef typename ifTrueThenFirst< (  sizeof(T1) > sizeof(T2)  ), T1, T2  >::ResultT ResultT; 
};
 
 
 
 
template <typename T1, typename T2>
typename Promotion<T1, T2>::ResultT division(T1 a, T2 b)
{
    return a / b;
}
 
int main()
{
    float f = 435;
    double d = 45645;
    float f2 = division(f, d);
 
    return 0;
}
вот пример применения свойства продвижения, можно специализировать Promotion для некоторых типов, а по умолчанию будет выбран тип с наибольшим размером
0
16.12.2011, 20:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2011, 20:12

Вызов функции с разным количеством аргументов
Функция MyFunc может принимать разное количество аргументов: void MyFunc(int...

Функции для работы с типом char*
Здравствуйте! Подскажите ресурс, где описана реализация основных функции для...

Функции с произвольным количеством и типом аргументов.
Начал изучать ф-ции с определенным количеством параметров и при изучении возник...


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

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

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