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

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

Войти
Регистрация
Восстановить пароль
 
Tawiskaron
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 2
#1

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

16.12.2011, 19:09. Просмотров 943. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблон функции с разным возвращаемым типом (C++):

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

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

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

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

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

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

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
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 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* - C++
Здравствуйте! Подскажите ресурс, где описана реализация основных функции для работы с указателями на строки

Функции с произвольным количеством и типом аргументов. - C++
Начал изучать ф-ции с определенным количеством параметров и при изучении возник вопрос, а именно: #include &lt;iostream&gt; using...

Ссылки на объекты в функции с не заданным типом переменных - C++
Как правильно передавать ссылки на объекты в функции с не заданным типом переменных и возможно ли это? Для общего случая я это...

Как искать функции, работающие с определенным типом? - C++
Всем привет! Сейчас у меня типичная нудная задача: создать строку wchar_t, конвертировать цифру из int в wchar_t, затем склеить...


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

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

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