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

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

Войти
Регистрация
Восстановить пароль
 
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

Result_of + variadic templates - C++

19.12.2014, 13:18. Просмотров 495. Ответов 12
Метки нет (Все метки)

Как здесь можно вывести возвращаемый тип функторов? res_t должен получиться типом которым они параметризуются.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename ... F>
struct A
{
   using res_t = typename std::result_of<F()>::type;
   std::vector<res_t> results;
};
 
template <typename ... F>
A<F ...> make_A(F&& ... f) {
   return A<F ...>(std::forward<F>(f) ...);
}
 
int main()
{
   auto a = make_A(std::plus<int>(), std::minus<int>(), std::multiplies<int>());
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2014, 13:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Result_of + variadic templates (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.12.2014, 13:25 #2
DiffEreD, Непонятно, что хочется. res_t должен быть <int, int, int> или как?
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.12.2014, 13:27  [ТС] #3
res_t должен быть int.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.12.2014, 13:50 #4
DiffEreD, Если это как-то и делается то явно не так. + к тому, как можно звать result_of, без аргументов? Туда нужно подавать точную сигнатуру http://en.cppreference.com/w/cpp/types/result_of.

Добавлено через 17 минут
Склоняюсь к тому, что это невозможно.
std::result_of требует полную сигнатуру функции, вида:
C++
1
std::result_of<decltype(&std::plus<int>::operator())(std::plus<int>, int, int)>
или
C++
1
std::result_of<std::plus<int>(int, int)>
decltype аналогично требует знать тип аргументов. А если мы знаем тип аргументов -> знаем чем параметризован функтор и задача становится бессмысленной.
1
hoggy
Нарушитель
6581 / 2762 / 476
Регистрация: 15.11.2014
Сообщений: 6,105
Завершенные тесты: 1
19.12.2014, 14:25 #5
предлагаю рассмотреть получение результата выполнения на примере моего "упращенного детектора функций-членов"
http://rextester.com/HOGG6125

Так же, рекомендую ознакомится с полной версией детектора членов-класса (данных и функций):
http://ideone.com/ObElnu


Умеет искать данные-члены или функции-члены по всей иерархии классов, включая базовые. Учитывает модификаторы доступа public/protected/private.

Техника содержит ответы на все ваши вопросы.
2
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.12.2014, 15:14  [ТС] #6
hoggy, код познавательный - пойдет в мою коллекцию. Но все равно я пока не понял как бы это могло выглядеть в моем случае. Вот на что меня хватило.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename ... F>
struct A
{
   template <typename ... Args>
   using res_t = decltype(std::declval<F>().operator()(std::declval<Args>()...));
 
   std::vector<res_t> results;
   std::tuple<F...> funcs;
 
   A(F&& ... f) : funcs(std::make_tuple(std::forward<F>(f) ...)) {}
};
 
template <typename ... F>
A<F ...> make_A(F&& ... f) {
   return A<F ...>(std::forward<F>(f) ...);
}
 
int main()
{
   auto a = make_A(std::plus<int>(), std::minus<int>(), std::multiplies<int>());
}
Добавлено через 44 секунды
Буду еще думать.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.12.2014, 15:22 #7
DiffEreD, Сходу неверно, нету анпака F при создании res_t.
В вектор это тоже особо не запилить.
Как минимум должно быть что-то вроде

C++
1
using res_t = std::tuple<typename do_something_that_for_type_of_f<F>::type...>;
0
Croessmah
Эксперт CЭксперт С++
13221 / 7493 / 845
Регистрация: 27.09.2012
Сообщений: 18,413
Записей в блоге: 3
Завершенные тесты: 1
19.12.2014, 15:24 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template < typename T , typename ... F >
struct get_first_type
{
   typedef T type ;
};
 
template < typename ... F >
struct A
{
   //Функтор должен содержать соответствующий typedef для возвращаемого значения
   using res_t = typename decltype(typename get_first_type<F...>::type())::result_type ;
 
   std::vector < res_t > results ;
};
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.12.2014, 15:32 #9
Хотя возможно я не прав, я полагал что хочется, чтобы тип определялся у каждого переданного функтора. Если нужен только общий (от первого по сути), то нужно допилить вариант Croessmah в том ключе, чтобы получить тип результат выполнения функтора.
0
Croessmah
Эксперт CЭксперт С++
13221 / 7493 / 845
Регистрация: 27.09.2012
Сообщений: 18,413
Записей в блоге: 3
Завершенные тесты: 1
19.12.2014, 15:36 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
чтобы тип определялся у каждого переданного функтора.
тогда какой тип будет у std::vector< res_t > ?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.12.2014, 15:41 #11
Croessmah, Поэтому я и предоставил вариант с таплом. Затупил, бывает.
0
Croessmah
Эксперт CЭксперт С++
13221 / 7493 / 845
Регистрация: 27.09.2012
Сообщений: 18,413
Записей в блоге: 3
Завершенные тесты: 1
19.12.2014, 15:46 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
И как вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template < size_t N , typename T , typename ... F >
struct get_first_type
{
   typedef typename get_first_type<N-1,F...>::type type ;
};
 
template<>
template < typename T , typename ... F >
struct get_first_type<0 , T , F... >
{
   typedef T type ;
};
 
 
 
template < typename ... F >
struct A
{
   // 0 - определяем возвращаемый тип по первому функтору, 1 - по второму, и т.д.
   using res_t = typename decltype(typename get_first_type<0,F...>::type())::result_type ;
 
   std::vector < res_t > results ;
};
1
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.12.2014, 16:44  [ТС] #13
Конечно извращение, но все же:
C++
1
2
3
4
5
6
7
8
9
template <typename ... F>
struct A
{
   using help_t = std::tuple<F ...>;
   using res_t = typename std::remove_reference<decltype(std::get<0>(std::declval<help_t>()))>::type::result_type;
   static_assert(std::is_same<res_t, int>::value, "must be int");
 
   std::vector<res_t> results;
};
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2014, 16:44
Привет! Вот еще темы с ответами:

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

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

Шаблонное вычисление типов и Variadic Templates - C++
Можно ли сделать что-то вроде этого: Этот код, естественно, не компилируется: template&lt;typename T&gt; class mtd_parser; ...

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


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

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

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