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

Указатель на шаблон функции - C++

Восстановить пароль Регистрация
 
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
01.12.2012, 02:30     Указатель на шаблон функции #1
Доброй ночи всем! Есть шаблон функции сравнения двух чисел:
C++
1
2
3
4
5
template <typename _Tp>
bool comp(_Tp & a, _Tp & b)
{
    return (a >= b)? 1 : 0;
}
Задание звучит так:
"Докажите, что при компиляции программа создаёт 2 разные функции для заданного шаблона".

В Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char   ca(5), cb(3);
int      ia(2), ib(3);
 
cout << comp(ca, cb) << endl;   // 1
cout << comp(ia, ib) << endl;   // 0
 
bool (*pC)(char&, char&);
pC = comp;
cout << "Char   " << &pC << endl;
 
bool (*pI)(int&, int&);
pI = comp;
cout << "Int    " << &pI << endl;
Решил вывести адреса этих двух функций. Работает только тогда, когда перед указателями на функцию стоят амперсанды (строки 10 и 14 в main.cpp). Почему без & выводятся 1 ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.12.2012, 02:51     Указатель на шаблон функции #2
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Работает только тогда, когда перед указателями на функцию стоят амперсанды (строки 10 и 14 в main.cpp).
Ошибочное мнение. Выводятся адреса указателей, но не функций
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
#include <iostream>
 
template <class T>
void func()
{
 
}
 
int main()
{
    auto* func_int1_ptr = func<int>;
    auto* func_int2_ptr = func<int>;
    auto* func_char_ptr = func<char>;
 
    std::cout << "int1: " << &func_int1_ptr << std::endl;
    std::cout << "int2: " << &func_int2_ptr << std::endl;
    std::cout << "char: " << &func_char_ptr << std::endl;
    std::cout << std::endl;
 
    std::cout   << "int1 == int2: " << std::boolalpha
                << (func_int1_ptr == func_int2_ptr) << std::endl;
    std::cout   << "char == int1: " << std::boolalpha
                << (func_char_ptr == func_int1_ptr) << std::endl;
    std::cout << std::endl;
 
    auto& func_int_ref  = func<int>;
    auto& func_char_ref = func<char>;
 
    std::cout   << "int == char: " << std::boolalpha
                << (func_int_ref == func_char_ref) << std::endl;
    return 0;
}
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Почему без & выводятся 1
Адрес функции будет всегда определен как true.
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    int a();
    std::cout << a << std::endl;
    return 0;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
01.12.2012, 02:52     Указатель на шаблон функции #3
Не проще так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <typeinfo>
 
template <typename T>
bool comp(T &a, T &b)
{
    if (typeid(T) == typeid(int)) std::cout<< "int: ";
    else if (typeid(T) == typeid(char)) std::cout<< "char: ";
    return a >= b;
}
 
int main()
{
    char ca(5), cb(3);
    int ia(2), ib(3);
    std::cout << std::boolalpha << comp(ca, cb) << std::endl;   // 1
    std::cout << std::boolalpha << comp(ia, ib) << std::endl;   // 0
    return 0;
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.12.2012, 02:58     Указатель на шаблон функции #4
Не по заданию.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
01.12.2012, 03:02     Указатель на шаблон функции #5
Цитата Сообщение от soon Посмотреть сообщение
Проще. Остапа понесло.
Эта фраза относилась скорее к замыслу автора.
Впрочем, интересную инфу и ответ на вопрос он в посте выше (№2) подчерпнул.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.12.2012, 03:02     Указатель на шаблон функции #6
MrGluck, Я вообще сначала не то в коде увидел
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
01.12.2012, 03:05     Указатель на шаблон функции #7
Суть в том что к при выводе к bool приводится адрес
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
01.12.2012, 22:16  [ТС]     Указатель на шаблон функции #8
При попытке создать
C++
1
auto* pC  = comp<char>;
Компилятор выдаёт ошибки:
main.cpp:17: error: ISO C++ forbids declaration of `pC' with no type
main.cpp:17: error: cannot resolve overloaded function `comp' based on conversion to type `int*'

Как исправить?
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
01.12.2012, 22:23     Указатель на шаблон функции #9
Цитата Сообщение от ilikeMagic Посмотреть сообщение
Как исправить?
компилировать с поддержкой c++11.
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
01.12.2012, 22:25  [ТС]     Указатель на шаблон функции #10
К сожалению, не могу так исправить. Есть другие варианты?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
01.12.2012, 22:26     Указатель на шаблон функции #11
ilikeMagic,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <typeinfo>
 
template <typename _Tp>
bool comp(const _Tp & a, const _Tp & b)
{
    std::cout << typeid(_Tp).name() << std::endl;
    return a >= b;
}
 
int main()
{
    comp(4, 2); // int
    comp(4.12, 2.34); // double
    comp(4.12f, 2.34f); // float
    comp('x', 'a'); // char
    return 0;
}
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
01.12.2012, 22:31  [ТС]     Указатель на шаблон функции #12
А как доказать, что функции то разные?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
01.12.2012, 22:35     Указатель на шаблон функции #13
ilikeMagic, вывод на экран разный будет. Или этого мало?
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
01.12.2012, 22:47  [ТС]     Указатель на шаблон функции #14
Функция то одна и та же может быть. Лучше через указатели и старый компилятор)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.12.2012, 22:53     Указатель на шаблон функции #15
Тогда лучше ассемблерный листинг того, что начудил компилятор.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
01.12.2012, 22:55     Указатель на шаблон функции #16
Цитата Сообщение от ilikeMagic Посмотреть сообщение
А как доказать, что функции то разные?
ищи name mangling.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2012, 22:56     Указатель на шаблон функции
Еще ссылки по теме:

C++ Классы, указатель на функции
Массив в функции через указатель C++
C++ Указатель на функции

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

Или воспользуйтесь поиском по форуму:
ilikeMagic
11 / 11 / 2
Регистрация: 26.04.2012
Сообщений: 104
01.12.2012, 22:56  [ТС]     Указатель на шаблон функции #17
Ассемблерный листинг уже использовал) Необходимо вторым способом защитить задание.
Yandex
Объявления
01.12.2012, 22:56     Указатель на шаблон функции
Ответ Создать тему
Опции темы

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