С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Mirmik
techpriest
625 / 206 / 55
Регистрация: 27.02.2014
Сообщений: 1,089
1

Указатель на перегруженную функцию по шаблонному параметру

04.09.2017, 18:45. Просмотров 212. Ответов 8
Метки нет (Все метки)

Допустим, у меня есть перегруженная функция func с одним параметром. Как написать шаблонную функцию, которая вернет указатель на вариант функции func, способный принять аргумент типа, переданного в шаблоне?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2017, 18:45
Ответы с готовыми решениями:

Почему без приведения типа невозможно выбрать нужный указатель на перегруженную функцию-член?
#include <iostream> #include <functional> using namespace std; class...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось...

Написать перегруженную функцию
Написать перегруженную функцию для возведения в степень и извлечения корня.

Написать перегруженную функцию
Написать перегруженные функции и основную программу, которая их вызывает. 1....

Перегруженную функцию переделать в виртуальную
Сам как не знаю сделать пожалуйста помогите)) Есть перегруженная функция, нужно...

8
DrOffset
9017 / 4862 / 1198
Регистрация: 30.01.2014
Сообщений: 7,947
04.09.2017, 19:02 2
Mirmik,

C++
1
2
3
4
5
6
7
8
9
10
11
void foo(int) {
}
void foo(double) {
}
 
 
template <typename T>
void (* get_foo() )(T)
{
    return &foo;
}
0
Mirmik
techpriest
625 / 206 / 55
Регистрация: 27.02.2014
Сообщений: 1,089
04.09.2017, 19:38  [ТС] 3
Логично ...

А почему не работает вот это?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
template<typename Arg> void foo(Arg arg);
 
template <typename T>
void (* get_foo() )(T)
{
    return &foo<T>;
}
 
int main() {
    get_foo<const int>()(4);
}
 
template<>
void foo(const int) {
    printf("const int");
}
 
template<>
void foo(double) {
    printf("double");
}
0
hoggy
Заблокирован
Эксперт С++
04.09.2017, 19:45 4
Цитата Сообщение от Mirmik Посмотреть сообщение
А почему не работает вот это?
потому кое кто налажал с синтаксисом полной специализации шаблоно-функции:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
template<typename Arg> void foo(Arg arg);
 
template <typename T>
void (* get_foo() )(T)
{
    return &foo<T>;
}
 
int main() {  get_foo<const int>()(4); }
 
template<>
void foo<const int>(const int) { printf("const int"); }
 
template<>
void foo<double>(double) { printf("dou"); }
0
Mirmik
techpriest
625 / 206 / 55
Регистрация: 27.02.2014
Сообщений: 1,089
04.09.2017, 19:58  [ТС] 5
Ок!
А теперь самый главный вопрос:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
template<typename Arg> void foo(Arg arg);
 
template <typename T>
void (* get_foo() )(T)
{
    return &foo<T>;
}
 
template<>
void foo<const int>(const int) { printf("int"); }
 
template<>
void foo<double>(double) { printf("dou"); }
 
int main() { get_foo<int>()(4); }
Как сделать так, чтобы получив в качестве параметра int, компилятор обнаружил, что у него есть реализация const int и использовал её, как ближайшую подходящую, а не искал нереализованный foo<int>?
0
DrOffset
9017 / 4862 / 1198
Регистрация: 30.01.2014
Сообщений: 7,947
04.09.2017, 20:11 6
Цитата Сообщение от Mirmik Посмотреть сообщение
Как сделать так, чтобы получив в качестве параметра int, компилятор обнаружил, что у него есть реализация const int и использовал её, как ближайшую подходящую, а не искал нереализованный foo<int>?
Можно немного помочь ему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <typename F, typename ...Fs>
struct function_sig_apply;
    
template <typename R, typename Arg, typename ...Fs>
struct function_sig_apply<R(Arg), Fs...>
    : function_sig_apply<Fs...>
{
    using function_sig_apply<Fs...>::check_sig;
        
    static R (* check_sig(Arg) )(Arg);
};
template <typename R, typename Arg>
struct function_sig_apply<R(Arg)>
{
    static R (* check_sig(Arg) )(Arg);
};
 
template <typename T>
auto get_foo() -> decltype(function_sig_apply<void(int), void(double)>::check_sig(std::declval<T>()))
{
    return &foo;
}
Добавлено через 6 минут
Только с шаблоном это не будет работать.
Потому что преспокойно подставит аргумент (любой).
Только перегрузка.
0
Mirmik
techpriest
625 / 206 / 55
Регистрация: 27.02.2014
Сообщений: 1,089
04.09.2017, 20:15  [ТС] 7
... А если более универсально... Тоесть, чтобы не надо было типы указывать...
У перегрузки есть проблема. Все перегрузки надо определить выше всей этой магии...

Хотя... Может и нет... (Не, глупость сказал...)
0
DrOffset
9017 / 4862 / 1198
Регистрация: 30.01.2014
Сообщений: 7,947
04.09.2017, 20:17 8
Цитата Сообщение от Mirmik Посмотреть сообщение
... А если более универсально... Тоесть, чтобы не надо было типы указывать...
Не получится.
0
Mirmik
techpriest
625 / 206 / 55
Регистрация: 27.02.2014
Сообщений: 1,089
04.09.2017, 20:47  [ТС] 9
Неужели, нет никакой возможности узнать адрес функции, которая будет вызвана, если передать ей объект такой-то?
0
04.09.2017, 20:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2017, 20:47

Класс Integer и опредлить перегруженную функцию
Здравстуйте у меня вот такое задание: Создать класс целых чисел integer....

Как переопределить перегруженную функцию в производном классе?
Как переопределить перегруженную функцию в производном классе? #include...

Создать перегруженную функцию для вывода нечетных элементов массива
Сделать через перегруженную функцию: Задан массив целых чисел. Вывести на...


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

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

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