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

Result_of + variadic templates - C++

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.12.2014, 13:18     Result_of + variadic templates #1
Как здесь можно вывести возвращаемый тип функторов? 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>());
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2014, 13:18     Result_of + variadic templates
Посмотрите здесь:

C++ recursion with variadic template
C++ Generic inheritance. Templates
Variadic Templates C++
templates, STL C++
C++ Variadic templates fail
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.12.2014, 13:25     Result_of + variadic templates #2
DiffEreD, Непонятно, что хочется. res_t должен быть <int, int, int> или как?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.12.2014, 13:27  [ТС]     Result_of + variadic templates #3
res_t должен быть int.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.12.2014, 13:50     Result_of + variadic templates #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 аналогично требует знать тип аргументов. А если мы знаем тип аргументов -> знаем чем параметризован функтор и задача становится бессмысленной.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
19.12.2014, 14:25     Result_of + variadic templates #5
предлагаю рассмотреть получение результата выполнения на примере моего "упращенного детектора функций-членов"
http://rextester.com/HOGG6125

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


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

Техника содержит ответы на все ваши вопросы.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.12.2014, 15:14  [ТС]     Result_of + variadic templates #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 секунды
Буду еще думать.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.12.2014, 15:22     Result_of + variadic templates #7
DiffEreD, Сходу неверно, нету анпака F при создании res_t.
В вектор это тоже особо не запилить.
Как минимум должно быть что-то вроде

C++
1
using res_t = std::tuple<typename do_something_that_for_type_of_f<F>::type...>;
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
19.12.2014, 15:24     Result_of + variadic templates #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 ;
};
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.12.2014, 15:32     Result_of + variadic templates #9
Хотя возможно я не прав, я полагал что хочется, чтобы тип определялся у каждого переданного функтора. Если нужен только общий (от первого по сути), то нужно допилить вариант Croessmah в том ключе, чтобы получить тип результат выполнения функтора.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
19.12.2014, 15:36     Result_of + variadic templates #10
Цитата Сообщение от ForEveR Посмотреть сообщение
чтобы тип определялся у каждого переданного функтора.
тогда какой тип будет у std::vector< res_t > ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.12.2014, 15:41     Result_of + variadic templates #11
Croessmah, Поэтому я и предоставил вариант с таплом. Затупил, бывает.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
19.12.2014, 15:46     Result_of + variadic templates #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 ;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2014, 16:44     Result_of + variadic templates
Еще ссылки по теме:

Variadic templates C++
C++ Variadic templates
C++ Перегрузка операторов и templates

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.12.2014, 16:44  [ТС]     Result_of + variadic templates #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;
};
Yandex
Объявления
19.12.2014, 16:44     Result_of + variadic templates
Ответ Создать тему
Опции темы

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