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

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

Восстановить пароль Регистрация
 
 
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
28.09.2013, 20:53     Объявить аргументы по шаблону #1
Доброго времени суток
Задача весьма расплывчатая: нужно объявить функцию, или указатель на нее шаблоном

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

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 не подходит

Собственно задумка в том, чтобы данная функция находилась в классе, а при его инициализации передавалась ссылка на функцию, чтобы в дальнейшем была возможность вызвать функцию из класса с проверкой аргументов переданной функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 21:11     Объявить аргументы по шаблону #2
Я вообще ничего не понял.. Надо объявить шаблонную функцию и объявить тип - указатель на эту функцию?
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
28.09.2013, 21:13     Объявить аргументы по шаблону #3
Автор, я тоже нифига не понял, тебе надо сделать вот это или что?
хабр
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.09.2013, 21:14     Объявить аргументы по шаблону #4
h3mbr0, о каком стандарте C++ мы говорим? до с++11 реализовать это проблематично
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
28.09.2013, 21:22  [ТС]     Объявить аргументы по шаблону #5
Цитата Сообщение от ct0r Посмотреть сообщение
Автор, я тоже нифига не понял, тебе надо сделать вот это или что?
хабр
Похоже, что да) сейчас попробую осмыслить

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

Цитата Сообщение от h3mbr0 Посмотреть сообщение
О том, который реализован в MVC от 2012 студии
Насколько мне известно, там реализована только часть стандарта c++11
там должны быть tuple'ы, поэтому задачу можно решить рекурсивно пройдя проверкой по tuple'у
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.09.2013, 21:47     Объявить аргументы по шаблону #7
alex_x_x, tuple уже готовый класс. А реализован на базе variadic templates. Что, видимо, и нужно использовать ТС'у.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
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, он хранит адреса и содержит методы для хука, анхука и вызова

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

Поскольку с функцией это будет выглядеть достаточно громоздко, есть ли возможность объявить указатель на функцию с типом, переданным при инициализации?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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;
}
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
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;
}

Не по теме:

@_______@


Благодарю, но все таки, если реально реализовать - в приоритете Объявить аргументы по шаблону
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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;
}
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
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>", не являющегося типом
Код слишком трудный, не могу понять в чем проблема
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 22:34     Объявить аргументы по шаблону #13
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Код слишком трудный, не могу понять в чем проблема
Этот код требует стандарта C++11
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
28.09.2013, 22:37  [ТС]     Объявить аргументы по шаблону #14
Цитата Сообщение от castaway Посмотреть сообщение
Этот код требует стандарта C++11
Выходит, студия его не поддерживает
Все не как у людей
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
28.09.2013, 22:37     Объявить аргументы по шаблону #15
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Выходит, студия его не поддерживает
Все не как у людей
2012 студия поддерживает
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
28.09.2013, 22:39  [ТС]     Объявить аргументы по шаблону #16
Цитата Сообщение от Olivеr Посмотреть сообщение
2012 студия поддерживает
С нее и пытался компилить
Может 2013?

1>------ Построение начато: проект: Keygen, Конфигурация: Release Win32 ------
1> main.cpp
1>main.cpp(3): error C2332: class: отсутствует имя тега
1>main.cpp(3): error C2993: : недопустимый тип для параметра шаблона "<unnamed-tag>", не являющегося типом
1>main.cpp(3): error C2143: синтаксическая ошибка: отсутствие "," перед "..."
1>main.cpp(4): error C2061: синтаксическая ошибка: идентификатор "Args"
1>main.cpp(22): error C2332: class: отсутствует имя тега
1>main.cpp(22): error C2993: : недопустимый тип для параметра шаблона "<unnamed-tag>", не являющегося типом
1>main.cpp(22): error C2143: синтаксическая ошибка: отсутствие "," перед "..."
1>main.cpp(23): error C2065: Args: необъявленный идентификатор
1>main.cpp(23): error C2143: синтаксическая ошибка: отсутствие ")" перед "..."
1>main.cpp(24): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>main.cpp(30): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>main.cpp(33): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>main.cpp(34): error C2065: Args: необъявленный идентификатор
1>main.cpp(35): error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
1>main.cpp(36): error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
1>main.cpp(39): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>main.cpp(40): error C2143: синтаксическая ошибка: отсутствие "," перед ")"
1>main.cpp(43): error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
1>main.cpp(44): error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
1>main.cpp(44): fatal error C1004: непредвиденное обнаружение конца файла
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
========== Развертывание: успешно: 0, с ошибками: 0, пропущено: 0 ==========
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
28.09.2013, 22:40     Объявить аргументы по шаблону #17
h3mbr0, попробуйте добавить параметр -std=c++11 в параметры компилятора
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
28.09.2013, 22:41  [ТС]     Объявить аргументы по шаблону #18
Цитата Сообщение от Olivеr Посмотреть сообщение
h3mbr0, попробуйте добавить параметр -std=c++11 в параметры компилятора
1>cl : командная строка warning D9002: пропуск неизвестного параметра "-std=c++11"
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 22:43     Объявить аргументы по шаблону #19
Цитата Сообщение от Olivеr Посмотреть сообщение
h3mbr0, попробуйте добавить параметр -std=c++11 в параметры компилятора
Такой синтаксис параметров в GCC, подозреваю что в MSVC он другой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 22:46     Объявить аргументы по шаблону
Еще ссылки по теме:

C++ Поиск по шаблону
Проверка ввода по шаблону C++
Создать матрицу по заданному шаблону C++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.09.2013, 22:46     Объявить аргументы по шаблону #20
мой вариант, но я не сильно tuple'ы бачу, так что

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
48
49
50
51
52
53
54
55
56
#include <tuple>                                                           
#include <cstdlib>                                                         
#include <type_traits>                                                     
#include <iostream>                                                        
#include <stdexcept>                                                       
                                                                           
void check (const int t) {                                                 
    if (t > 3) throw std::logic_error("smth bad");                         
}                                                                          
                                                                           
void check (bool value) {                                                  
                                                                           
}                                                                          
                                                                           
template <typename _tuple, size_t index>                                   
struct operate_tuple_element {                                             
    static void operate (const _tuple& t) {                                
        check ( std::get<index - 1> (t) );                                 
        operate_tuple_element<_tuple, index - 1>::operate (t);             
    }                                                                      
};                                                                         
                                                                           
template <typename _tuple>                                                 
struct operate_tuple_element<_tuple, 0> {                                  
    static void operate (const _tuple& t) {                                
        check ( std::get<0>(t) );                                          
    }                                                                      
};                                                                         
                                                                           
template <typename F>                                                      
class FWrapper {                                                           
public:                                                                    
    FWrapper (F& f) : f(f) { }                                             
    template<typename... Args>                                             
    typename std::result_of<F(Args...)>::type operator () (Args... args) { 
        operate_tuple_element<std::tuple<Args...>, sizeof...(Args)>        
                ::operate (std::make_tuple(args...));                      
        return f(args...);                                                 
    }                                                                      
private:                                                                   
    F f;                                                                   
};                                                                         
                                                                           
template <typename F>                                                      
FWrapper<F> create_wrapper (F f){                                          
    return FWrapper<F> (f);                                                
}                                                                          
                                                                           
int my_fun (int a, bool b, int c) {                                        
    return b ? a : c;                                                      
}                                                                          
                                                                           
int main () {                                                              
    auto wrapper = create_wrapper (my_fun);                                
    std::cout << wrapper(1, true, 2) << std::endl;                         
}
Yandex
Объявления
28.09.2013, 22:46     Объявить аргументы по шаблону
Ответ Создать тему
Опции темы

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