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

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

Войти
Регистрация
Восстановить пароль
 
Mirmik
145 / 117 / 30
Регистрация: 27.02.2014
Сообщений: 682
#1

Шаблонное вычисление типов и Variadic Templates - C++

11.12.2015, 13:11. Просмотров 250. Ответов 7
Метки нет (Все метки)

Можно ли сделать что-то вроде этого:

Этот код, естественно, не компилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T> class mtd_parser;
template<typename T, typename R, typename ... V>
class mtd_parser<R(T::*)(V ...)>
{public:
    using basic_type = T;
    using output_type = R;
    using variable_types = V ... ;
};
 
void* (*ptr)(int,double);
 
void* (*ptr2)(mtd_parser<decltype(ptr)>::variable_types);
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2015, 13:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблонное вычисление типов и Variadic Templates (C++):

Variadic Templates - как обращаться к аргументам variadic-функции? - C++
Всем привет! Наверное, рано мне ещё с моими скудными знаниями в это лезть, но, изучив шаблоны и вариадик-функции, я, естественно, горю...

Variadic templates - C++
как можно сделать чтобы функция принимала бесконечное количество объектов std::string? (только их) я пробовал вот так: template&lt;const...

Variadic Templates - C++
проблема только в переводе на русский, обычно это &quot;Шаблоны с переменным числом аргументов&quot; но такое длинное выражение долго не проживёт....

Variadic templates - C++
1. как можно сделать чтобы передавались ссылки на переменные? (с variadic templates) 2. как вообще обращаться к переменным объявленным...

Variadic templates - C++
А как бы так исхитриться, чтобы шаблонная функция, использующая Variadic templates узнала размер передаваемых ей параметров с тем, чтобы,...

Variadic templates fail - C++
Здравствуйте. У меня проблема, нужно реализовать в проекте функционал, который будет использовать шаблоны с переменным количеством...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ssXXss
266 / 188 / 10
Регистрация: 15.01.2011
Сообщений: 681
11.12.2015, 13:14 #2
посмотри тут
0
rikimaru2013
C++ Game Dev
2435 / 1129 / 240
Регистрация: 30.11.2013
Сообщений: 3,687
11.12.2015, 13:17 #3
А можно описание задачи и примеры вызова функций. Что хотите и что не получается?
0
Mirmik
145 / 117 / 30
Регистрация: 27.02.2014
Сообщений: 682
11.12.2015, 13:26  [ТС] #4
ssXXss
Эмм... А чем поможет rtti в вычислении типов на этапе компиляции?

rikimaru2013
Ух... Боюсь, что нельзя. Просто изучаю.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
11.12.2015, 13:33 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Mirmik Посмотреть сообщение
Можно ли сделать что-то вроде этого
Можно.
Кликните здесь для просмотра всего текста
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
// compile with C++11, GCC compatible compiler.
 
template <typename R, typename ...V>
struct rebind_args;
 
template <typename R, typename C, typename... V>
struct rebind_args<C (R()), V...>
{
    using type = R(C::*)(V...);
};
template <typename R, typename... V>
struct rebind_args<R(), V...>
{
    using type = R(*)(V...);
};
 
template <typename T>
struct mtd_parser;
 
template <typename R, typename T, typename ...V>
struct mtd_parser<R(T::*)(V...)>
{
    template <typename NF>
    using rebind_args_to = rebind_args<T (NF), V...>;
};
template <typename R, typename ...V>
struct mtd_parser<R(*)(V...)>
{
    template <typename NF>
    using rebind_args_to = rebind_args<NF, V...>;
};
/*************************/
 
template <typename T>
void print()
{
    printf("%s\n", __PRETTY_FUNCTION__);
}
 
struct C{};
 
int main()
{
    void* (*ptr)(int, double);
    void* (C::*ptr1)(int, double);
 
    mtd_parser<decltype(ptr)>::rebind_args_to<void*()>::type ptr2;
    mtd_parser<decltype(ptr1)>::rebind_args_to<void*()>::type ptr3;
 
    print<decltype(ptr2)>();
    print<decltype(ptr)>();
    print<decltype(ptr3)>();
}
http://rextester.com/NYS75365
1
ssXXss
266 / 188 / 10
Регистрация: 15.01.2011
Сообщений: 681
11.12.2015, 13:35 #6
а разве шаблонный код не генерируется на стадии компиляции ???
0
Mirmik
145 / 117 / 30
Регистрация: 27.02.2014
Сообщений: 682
11.12.2015, 14:09  [ТС] #7
DrOffset
Ну, это вы меня всё-таки обманываете.

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

Добавлено через 4 минуты
А, хотя сообразил... Действительно, можно ведь и с tuple провернуть туже фишку...
Хм... Согласен, не очень эстетично, но вполне функционально. Спасибо.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
11.12.2015, 18:30 #8
Цитата Сообщение от Mirmik Посмотреть сообщение
Согласен, не очень эстетично, но вполне функционально.
Эстетика зависит от конкретной задачи в комплексе. А то, что я тебе показал, это фактически паттерн.
А вообще rebind - это старый трюк. В стандартной библиотеке его использовали для получения правильного типа аллокатора для хранимого элемента в std::list. Здесь есть еще.

Добавлено через 30 секунд

Не по теме:

Цитата Сообщение от Mirmik Посмотреть сообщение
Ну, это вы меня всё-таки обманываете.
Какой я нехороший. Ай-ай-ай.



Добавлено через 10 минут
Цитата Сообщение от Mirmik Посмотреть сообщение
чтобы задать типы для tuple, который, после раскрытия, будет передан этой функции в качестве параметра
Ну а с 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
#include <cstdio>
#include <tuple>
 
template <typename T>
struct mtd_parser;
 
template <typename R, typename T, typename ...V>
struct mtd_parser<R(T::*)(V...)>
{
    using tuple_type = std::tuple<V...> ;
};
template <typename R, typename ...V>
struct mtd_parser<R(*)(V...)>
{
    using tuple_type = std::tuple<V...>;
};
/*************************/
 
template <typename T>
void print()
{
    printf("%s\n", __PRETTY_FUNCTION__);
}
 
struct C {};
 
int main()
{
    void* (*ptr)(int, double);
    void* (C::*ptr1)(int, double);
 
    void * (*ptr2)(mtd_parser<decltype(ptr)>::tuple_type);
    void * (*ptr3)(mtd_parser<decltype(ptr1)>::tuple_type);
    
    print<decltype(ptr2)>();
    print<decltype(ptr3)>();
}
http://rextester.com/AKYR85980

Еще можно упаковать аргументы в спец. тип. И передавать его в нужный контекст, а потом раскрывать его, где нужно. Но это вариация на тему.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2015, 18:30
Привет! Вот еще темы с ответами:

Result_of + variadic templates - C++
Как здесь можно вывести возвращаемый тип функторов? res_t должен получиться типом которым они параметризуются.template &lt;typename ... F&gt; ...

Разделить типы в variadic templates - C++
Допустим, я передаю в шаблон класса аргументы типов int, double, char*, cls&lt;int&gt;, int, cls&lt;double&gt; Я хочу создать в классе из всех pod...

Variadic templates локальные переменные - C++
Еще один вопрос по Variadic templates. Решаю следующую задачу: Необходимо сохранить в памяти функцию с набором параметров для...

Variadic templates, якобы provided 0 argumnets - C++
Есть кто онлайн? Проблема в вариадик темплейтсах с компилятором. Не пропускает следующий код: template&lt;typename... Args&gt; void...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.12.2015, 18:30
Ответ Создать тему
Опции темы

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