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

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

Войти
Регистрация
Восстановить пароль
 
 
h3mbr0
249 / 92 / 22
Регистрация: 12.03.2012
Сообщений: 374
#1

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

28.09.2013, 20:53. Просмотров 1177. Ответов 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
h3mbr0
249 / 92 / 22
Регистрация: 12.03.2012
Сообщений: 374
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 ==========
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
28.09.2013, 22:40 #17
h3mbr0, попробуйте добавить параметр -std=c++11 в параметры компилятора
0
h3mbr0
249 / 92 / 22
Регистрация: 12.03.2012
Сообщений: 374
28.09.2013, 22:41  [ТС] #18
Цитата Сообщение от Olivеr Посмотреть сообщение
h3mbr0, попробуйте добавить параметр -std=c++11 в параметры компилятора
1>cl : командная строка warning D9002: пропуск неизвестного параметра "-std=c++11"
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 22:43 #19
Цитата Сообщение от Olivеr Посмотреть сообщение
h3mbr0, попробуйте добавить параметр -std=c++11 в параметры компилятора
Такой синтаксис параметров в GCC, подозреваю что в MSVC он другой.
2
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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;                         
}
0
h3mbr0
249 / 92 / 22
Регистрация: 12.03.2012
Сообщений: 374
28.09.2013, 22:46  [ТС] #21
Цитата Сообщение от castaway Посмотреть сообщение
Такой синтаксис параметров в GCC, подозреваю что в MSVC он другой.
Нагуглил следующее:
AFAIR it's enabled by default.

It isn't, however, complete. For example you use initialiser lists which it lacks support for at the moment.

See the table here msdn.microsoft.com/en-gb/library/vstudio/hh567368.aspx for the status of C++11 features in both VS2010 and VS2012.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.09.2013, 22:47 #22
Цитата Сообщение от castaway Посмотреть сообщение
Такой синтаксис параметров в GCC, подозреваю что в MSVC он другой.
подозреваю, что та студия не поддерживает variadic template'ы
1
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 22:48 #23
Насколько мне известно, в Visual Studio 2012 реализованы не все возможности стандарта С++11, хотя могу и ошибаться..
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
28.09.2013, 22:49 #24
h3mbr0, еще так можно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int sum(int a, int b)
{
    return a + b;
}
 
template <class Function>
class Foo
{
public:
    Foo(Function f)
        : func(f) {}
 
    Function func;
};
 
int main()
{
    std::cout << Foo<int(*)(int, int)>(sum).func(42, 42);
    return 0;
}
1
h3mbr0
249 / 92 / 22
Регистрация: 12.03.2012
Сообщений: 374
28.09.2013, 22:49  [ТС] #25
Цитата Сообщение от castaway Посмотреть сообщение
Насколько мне известно, в Visual Studio 2012 реализованы не все возможности стандарта С++11, хотя могу и ошибаться..
Я ведь об этом и писал...
И действительно
Variadic templates v0.9, v1.0 - No - No

Жалко(

Всем спасибо за помощь, придется обходится макросами с костылями)
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.09.2013, 22:50 #26
Olivеr, в первом посте речь шла о проверке аргументов же
0
h3mbr0
249 / 92 / 22
Регистрация: 12.03.2012
Сообщений: 374
28.09.2013, 22:50  [ТС] #27
Цитата Сообщение от Olivеr Посмотреть сообщение
h3mbr0, еще так можно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int sum(int a, int b)
{
    return a + b;
}
 
template <class Function>
class Foo
{
public:
    Foo(Function f)
        : func(f) {}
 
    Function func;
};
 
int main()
{
    std::cout << Foo<int(*)(int, int)>(sum).func(42, 42);
    return 0;
}
Блин, а раньше нельзя было об этом?)
У меня почему-то возникала ошибка преобразования int(*)(int, int) в int(int,int)
Видимо, не так вызывал

Спасибо еще раз, буду пробовать
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
28.09.2013, 22:52 #28
Цитата Сообщение от alex_x_x Посмотреть сообщение
Olivеr, в первом посте речь шла о проверке аргументов же
ТС еще вот это попросил
Объявить аргументы по шаблону
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.09.2013, 22:52 #29
h3mbr0, чет я не пойму - как это связано с
Цитата Сообщение от h3mbr0 Посмотреть сообщение
чтобы в дальнейшем была возможность вызвать функцию из класса с проверкой аргументов переданной функции
Добавлено через 16 секунд
Olivеr, а, ок
1
Jupiter
Каратель
Эксперт С++
6565 / 3986 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.09.2013, 22:53 #30
h3mbr0, к 12-й студии есть три апдейта и Visual C++ Compiler November 2012 CTP
После установки в опциях проекта поменя тулсет на CTP
1
28.09.2013, 22:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 22:53
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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