Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
ДЕСАНТУРА
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 179
#1

Аргумент в виде шаблонной функции

23.09.2015, 13:55. Просмотров 215. Ответов 4
Метки нет (Все метки)

C++
1
void Function(любая_функция_с_одним_параметром){}
Как при помощи шаблона всунуть в аргумент функции, любую функцию с одним параметром, чтобы я мог делать так:
C++
1
2
3
4
void func1(int a){}
Function(func1);
int func2(string a){}
Function(func2, "Helo World");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2015, 13:55
Ответы с готовыми решениями:

Итераторы в шаблонной функции
Здравствуйте, пишу программу, в ознакомительных целях с шаблонными функциями. У...

Вызов шаблонной функции
Что я делаю не так? есть функция: template <class T> T rFF(string input_file)...

Создание шаблонной функции
Создать шаблонную функцию, изменяющий порядок элементов таким образом: первая...

Объявление шаблонной функции
Здравствуйте, встретил в учебнике это: template <typename Type, int size>...

Вызов шаблонной функции
Здравствуйте. Есть такой код: template<class _Ty1, class _Ty2> inline...

4
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.09.2015, 14:19 #2
ДЕСАНТУРА,
C++
1
Function(func1);
И что в этом случае должна сделать Function, если передана функция с аргументом, НО аргумент не передан?
0
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
23.09.2015, 14:20 #3
Функция invoke принимает первым параметром вызываемую сущность, а затем аргументы для ее вызова.

Не по теме:

Ps. Скоро в стандартной библиотеке!


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
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <functional>
namespace detail {
template <class F, class... Args>
inline auto INVOKE(F&& f, Args&&... args) ->
    decltype(std::forward<F>(f)(std::forward<Args>(args)...)) {
      return std::forward<F>(f)(std::forward<Args>(args)...);
}
 
template <class Base, class T, class Derived>
inline auto INVOKE(T Base::*pmd, Derived&& ref) ->
    decltype(std::forward<Derived>(ref).*pmd) {
      return std::forward<Derived>(ref).*pmd;
}
 
template <class PMD, class Pointer>
inline auto INVOKE(PMD pmd, Pointer&& ptr) ->
    decltype((*std::forward<Pointer>(ptr)).*pmd) {
      return (*std::forward<Pointer>(ptr)).*pmd;
}
 
template <class Base, class T, class Derived, class... Args>
inline auto INVOKE(T Base::*pmf, Derived&& ref, Args&&... args) ->
    decltype((std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...)) {
      return (std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...);
}
 
template <class PMF, class Pointer, class... Args>
inline auto INVOKE(PMF pmf, Pointer&& ptr, Args&&... args) ->
    decltype(((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...)) {
      return ((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...);
}
} // namespace detail
 
template< class F, class... ArgTypes>
decltype(auto) invoke(F&& f, ArgTypes&&... args) {
    return detail::INVOKE(std::forward<F>(f), std::forward<ArgTypes>(args)...);
}
 
void func1(int a){}
int func2(std::string a){}
 
int main()
{   using namespace std::literals::string_literals;
   
    invoke(func1, 5);
    invoke(func2, "Hello"s);    
}
2
ДЕСАНТУРА
6 / 6 / 5
Регистрация: 25.02.2015
Сообщений: 179
23.09.2015, 14:27  [ТС] #4
Цитата Сообщение от ForEveR Посмотреть сообщение
И что в этом случае должна сделать Function, если передана функция с аргументом, НО аргумент не передан?
Мой косяк, писал не в компиляторе, а в ручную, забыл вписать просто

Добавлено через 4 минуты
Цитата Сообщение от gromo Посмотреть сообщение
Функция invoke принимает первым параметром вызываемую сущность, а затем аргументы для ее вызова.
Извиняюсь что не по теме - но как проверить статична ли функция?
0
gromo
372 / 271 / 30
Регистрация: 04.09.2009
Сообщений: 1,214
23.09.2015, 18:29 #5
ДЕСАНТУРА, http://en.cppreference.com/w/cpp/types/is_member_function_pointer содержит true, если передана нестатическая функция-член, в сочетании со SFINAE можно выбирать статические/нестатические функции-члены в compile time.
Со свободными функциями дело обстоит сложнее, надо поразмыслить.
0
23.09.2015, 18:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2015, 18:29

Экспорт шаблонной функции из DLL
Привет! В DLL есть класс и глобальная шаблонная функция, для получения...

Ошибка вызова шаблонной функции
Вообщем у меня вопрос такой: Использую MVS 2010. Пишу шаблон функции для...

Вызов метода шаблонной функции
Изучаю шаблоны и не совсем могу понять момент, на 10 строке я объявляю метод, а...


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

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

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