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

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

Войти
Регистрация
Восстановить пароль
 
Mirmik
128 / 100 / 26
Регистрация: 27.02.2014
Сообщений: 584
#1

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

11.12.2015, 13:11. Просмотров 223. Ответов 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);
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2015, 13:11     Шаблонное вычисление типов и Variadic Templates
Посмотрите здесь:

Шаблонное дерево. Длиннейший путь. C++
Variadic Templates C++
C++ Variadic templates fail
Variadic templates C++
C++ Variadic templates
C++ Result_of + variadic templates
C++ Шаблонное наследование
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ssXXss
264 / 186 / 10
Регистрация: 15.01.2011
Сообщений: 668
11.12.2015, 13:14     Шаблонное вычисление типов и Variadic Templates #2
посмотри тут
rikimaru2013
C++ Game Dev
2349 / 1055 / 232
Регистрация: 30.11.2013
Сообщений: 3,497
11.12.2015, 13:17     Шаблонное вычисление типов и Variadic Templates #3
А можно описание задачи и примеры вызова функций. Что хотите и что не получается?
Mirmik
128 / 100 / 26
Регистрация: 27.02.2014
Сообщений: 584
11.12.2015, 13:26  [ТС]     Шаблонное вычисление типов и Variadic Templates #4
ssXXss
Эмм... А чем поможет rtti в вычислении типов на этапе компиляции?

rikimaru2013
Ух... Боюсь, что нельзя. Просто изучаю.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
11.12.2015, 13:33     Шаблонное вычисление типов и Variadic Templates #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
ssXXss
264 / 186 / 10
Регистрация: 15.01.2011
Сообщений: 668
11.12.2015, 13:35     Шаблонное вычисление типов и Variadic Templates #6
а разве шаблонный код не генерируется на стадии компиляции ???
Mirmik
128 / 100 / 26
Регистрация: 27.02.2014
Сообщений: 584
11.12.2015, 14:09  [ТС]     Шаблонное вычисление типов и Variadic Templates #7
DrOffset
Ну, это вы меня всё-таки обманываете.

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

Добавлено через 4 минуты
А, хотя сообразил... Действительно, можно ведь и с tuple провернуть туже фишку...
Хм... Согласен, не очень эстетично, но вполне функционально. Спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2015, 18:30     Шаблонное вычисление типов и Variadic Templates
Еще ссылки по теме:

Variadic Templates - как обращаться к аргументам variadic-функции? C++
Variadic templates C++
Variadic templates локальные переменные C++
C++ Variadic templates, якобы provided 0 argumnets
Шаблонное наследование C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
11.12.2015, 18:30     Шаблонное вычисление типов и Variadic Templates #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

Еще можно упаковать аргументы в спец. тип. И передавать его в нужный контекст, а потом раскрывать его, где нужно. Но это вариация на тему.
Yandex
Объявления
11.12.2015, 18:30     Шаблонное вычисление типов и Variadic Templates
Ответ Создать тему
Опции темы

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