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

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

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

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

Добавлено через 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Шаблон функции с разным возвращаемым типом (C++):

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

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

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

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

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

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
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 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
Привет! Вот еще темы с решениями:

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

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

Функции с типом но без имени параметра
Добрый день. Встретил следующую функцию: void f(int) { //код } //почему...

Возврат указателя из функции с нужным типом
Как как мне получить из функции указатель нужного мне типа? Можно ли для этого...


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

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

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