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

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

Войти
Регистрация
Восстановить пароль
 
 
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
#1

Объявить аргументы по шаблону - C++

28.09.2013, 20:53. Просмотров 1166. Ответов 30
Метки нет (Все метки)

Доброго времени суток
Задача весьма расплывчатая: нужно объявить функцию, или указатель на нее шаблоном

Цель - вызвать эту функцию с проверкой аргументов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
int f1(int a)
{
 return -a;
}
//...
template<typename retType, ARGS>
retType Func(PVOID Fn, ARGS)
{
  return  Fn(ARGS);
}
//..
Func(f1, 42);
(пример некорректный)
Мне нужен рабочий вариант или аналог
Наличие подсказки аргументов обязательно, т.е. макросы или inline-asm не подходит

Собственно задумка в том, чтобы данная функция находилась в классе, а при его инициализации передавалась ссылка на функцию, чтобы в дальнейшем была возможность вызвать функцию из класса с проверкой аргументов переданной функции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2013, 20:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объявить аргументы по шаблону (C++):

Объявить массив? Запросто! Объявить массив массивов? А как это? - C++
Доброго времени суток! Конечно, все знают, как объявить массив! int main () { int array; }

Аргументы функции: что значит "большие" и "небольшие" аргументы? - C++
Здравствуйте! Всем доброго дня! Растолкуйте пожалуйста! Что значит большие и небольшие?

Поиск по шаблону - C++
При реализации поиска по шаблону столкнулся со следующей проблемой: Шаблон: *abc Тест1: abc Тест2: fabc Тест3: ssabk_abc Первые...

Вопрос по шаблону - C++
Доброго времени суток! Есть шаблон функции которая находит минимальный эллемент массива и возвращает его. template &lt;typename Any,...

Поиск по шаблону * и? - C++
Здраствуите можете помочь с малеьким таки заданием ,я пытался еа куралесить ну не получилось. я вложил исходник в текстовом фаиле

Проверка ввода по шаблону - C++
Всем привет! Есть заданный шаблон, по которому пользователь должен вводить телефонный номер: (ХХХ) ХХХ-ХХ-ХХ; Как умнее и лучше всего...

30
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 21:11 #2
Я вообще ничего не понял.. Надо объявить шаблонную функцию и объявить тип - указатель на эту функцию?
0
ct0r
Игогошка!
1777 / 679 / 42
Регистрация: 19.08.2012
Сообщений: 1,295
Завершенные тесты: 1
28.09.2013, 21:13 #3
Автор, я тоже нифига не понял, тебе надо сделать вот это или что?
хабр
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.09.2013, 21:14 #4
h3mbr0, о каком стандарте C++ мы говорим? до с++11 реализовать это проблематично
0
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
28.09.2013, 21:22  [ТС] #5
Цитата Сообщение от ct0r Посмотреть сообщение
Автор, я тоже нифига не понял, тебе надо сделать вот это или что?
хабр
Похоже, что да) сейчас попробую осмыслить

Цитата Сообщение от alex_x_x Посмотреть сообщение
h3mbr0, о каком стандарте C++ мы говорим? до с++11 реализовать это проблематично
О том, который реализован в MVC от 2012 студии
Насколько мне известно, там реализована только часть стандарта c++11
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.09.2013, 21:27 #6
Цитата Сообщение от ct0r Посмотреть сообщение
Автор, я тоже нифига не понял, тебе надо сделать вот это или что?
хабр
boost::function/std::function насколько я представляю не оперирует аргументами

Цитата Сообщение от h3mbr0 Посмотреть сообщение
О том, который реализован в MVC от 2012 студии
Насколько мне известно, там реализована только часть стандарта c++11
там должны быть tuple'ы, поэтому задачу можно решить рекурсивно пройдя проверкой по tuple'у
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.09.2013, 21:47 #7
alex_x_x, tuple уже готовый класс. А реализован на базе variadic templates. Что, видимо, и нужно использовать ТС'у.
1
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
28.09.2013, 22:04  [ТС] #8
А реально ли реализовать нечто подобное:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int add(int a, int b)
{
    return a+b;
}
 
class Foo 
{
public:
    template <typename F>
    Foo::Foo(F f) 
    {
        pFunc = f;
    }
    F pFunc;
}
 
int main()
{
    Foo Bar(add);
    Bar.pFunc(1,2);
    return 0;
}
?

upd:
Объясню задумку:
имеется класс для реализации хука функции Function, он хранит адреса и содержит методы для хука, анхука и вызова

Так вот необходимо, чтобы функция вызова предлагала аргументы в соответствии с аргументами некой функции, адресом которой инициализируется класс

Поскольку с функцией это будет выглядеть достаточно громоздко, есть ли возможность объявить указатель на функцию с типом, переданным при инициализации?
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
28.09.2013, 22:14 #9
к первому посту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
template <class Function, class... Args>
auto foo(Function func, Args&& ...args) -> decltype(func(std::forward<Args>(args)...))
{
    return func(std::forward<Args>(args)...);
}
 
int mul(int a, int b)
{
    return a * b;
}
 
int main()
{
    std::cout << foo(mul, 5, 4);
    return 0;
}
1
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
28.09.2013, 22:16  [ТС] #10
Цитата Сообщение от Olivеr Посмотреть сообщение
к первому посту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
template <class Function, class... Args>
auto foo(Function func, Args&& ...args) -> decltype(func(std::forward<Args>(args)...))
{
    return func(std::forward<Args>(args)...);
}
 
int mul(int x)
{
    return x * x;
}
 
int main()
{
    std::cout << foo(mul, 5);
    return 0;
}

Не по теме:

@_______@


Благодарю, но все таки, если реально реализовать - в приоритете Объявить аргументы по шаблону
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
28.09.2013, 22:21 #11
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
#include <iostream>
 
template <class Function, class... Args>
auto foo(Function func, Args&& ...args) -> decltype(func(std::forward<Args>(args)...))
{
    return func(std::forward<Args>(args)...);
}
 
int mul(int a, int b)
{
    return a * b;
}
 
int sum(int a, int b)
{
    return a + b;
}
 
template <class Tp>
class Bar;
 
template <class RetTp, class... Args>
class Bar<RetTp(Args...)>
{
    using function_t = RetTp(*)(Args...);
    function_t func;
 
public:
    Bar(function_t f)
        : func(f) {}
 
    RetTp operator () (Args&& ...args)
    {
        return func(std::forward<Args>(args)...);
    }
};
 
int main()
{
    std::cout << foo(mul, 5, 4) << std::endl;
    std::cout << Bar<int(int, int)>(sum)(42, 42);
    return 0;
}
1
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
28.09.2013, 22:32  [ТС] #12
Цитата Сообщение от Olivеr Посмотреть сообщение
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
#include <iostream>
 
template <class Function, class... Args>
auto foo(Function func, Args&& ...args) -> decltype(func(std::forward<Args>(args)...))
{
    return func(std::forward<Args>(args)...);
}
 
int mul(int a, int b)
{
    return a * b;
}
 
int sum(int a, int b)
{
    return a + b;
}
 
template <class Tp>
class Bar;
 
template <class RetTp, class... Args>
class Bar<RetTp(Args...)>
{
    using function_t = RetTp(*)(Args...);
    function_t func;
 
public:
    Bar(function_t f)
        : func(f) {}
 
    RetTp operator () (Args&& ...args)
    {
        return func(std::forward<Args>(args)...);
    }
};
 
int main()
{
    std::cout << foo(mul, 5, 4) << std::endl;
    std::cout << Bar<int(int, int)>(sum)(42, 42);
    return 0;
}
error C2993: : недопустимый тип для параметра шаблона "<unnamed-tag>", не являющегося типом
Код слишком трудный, не могу понять в чем проблема
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 22:34 #13
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Код слишком трудный, не могу понять в чем проблема
Этот код требует стандарта C++11
1
h3mbr0
248 / 91 / 21
Регистрация: 12.03.2012
Сообщений: 360
28.09.2013, 22:37  [ТС] #14
Цитата Сообщение от castaway Посмотреть сообщение
Этот код требует стандарта C++11
Выходит, студия его не поддерживает
Все не как у людей
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
28.09.2013, 22:37 #15
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Выходит, студия его не поддерживает
Все не как у людей
2012 студия поддерживает
0
28.09.2013, 22:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 22:37
Привет! Вот еще темы с ответами:

[OpenCV] Поиск по шаблону - C++
Добрый день, имеется код с robocraft, в котором используется функция cvMatchTemplate, вопрос состоит в том, чтобы узнать нашла ли функция...

Аргументы и using - C++
Я прочитал мног статей про аргументы в функциях (вообще меня тупо интересовало что пишется в скобках после main) , Но ничего не понял...

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

Как генерировать текст по шаблону - C++
Подскажите, необходимо написать программу, генерирующую документ pdf или word. Т.е. примерно так: Имеется шаблон (кусок текста) в...


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

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

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