Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
1

Result_of + variadic templates

19.12.2014, 13:18. Просмотров 1053. Ответов 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
Ответы с готовыми решениями:

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

Variadic templates
typedef function&lt;double(double ...)&gt; fun; inline int sum() { return 0; }...

Variadic templates
1. как можно сделать чтобы передавались ссылки на переменные? (с variadic...

Variadic templates
А как бы так исхитриться, чтобы шаблонная функция, использующая Variadic...

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

12
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.12.2014, 13:25 2
DiffEreD, Непонятно, что хочется. res_t должен быть <int, int, int> или как?
0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.12.2014, 13:27  [ТС] 3
res_t должен быть int.
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
19.12.2014, 14:25 5
предлагаю рассмотреть получение результата выполнения на примере моего "упращенного детектора функций-членов"
http://rextester.com/HOGG6125

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


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

Техника содержит ответы на все ваши вопросы.
2
DiffEreD
1442 / 779 / 257
Регистрация: 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
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 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
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.12.2014, 15:32 9
Хотя возможно я не прав, я полагал что хочется, чтобы тип определялся у каждого переданного функтора. Если нужен только общий (от первого по сути), то нужно допилить вариант Croessmah в том ключе, чтобы получить тип результат выполнения функтора.
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
19.12.2014, 15:36 10
Цитата Сообщение от ForEveR Посмотреть сообщение
чтобы тип определялся у каждого переданного функтора.
тогда какой тип будет у std::vector< res_t > ?
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.12.2014, 15:41 11
Croessmah, Поэтому я и предоставил вариант с таплом. Затупил, бывает.
0
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,583
Записей в блоге: 2
Завершенные тесты: 1
19.12.2014, 15:46 12
Лучший ответ Сообщение было отмечено DiffEreD как решение

Решение

И как вариант:
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
1442 / 779 / 257
Регистрация: 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
19.12.2014, 16:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2014, 16:44

Variadic templates
как можно сделать чтобы функция принимала бесконечное количество объектов...

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

Разделить типы в variadic templates
Допустим, я передаю в шаблон класса аргументы типов int, double, char*,...


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

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

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