Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
korrav
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 21
#1

По ссылке на функцию получить тип возвращаемого этой функцией значения

05.05.2015, 13:11. Просмотров 801. Ответов 4
Метки нет (Все метки)

Существует задача следующего характера. Шаблон класса параметризуется ссылкой на функцию. Необходимо, чтобы один из членов класса имел тип, соответствующий типу возвращаемого функцией значения.
Чтобы больше было понятно, о чём идет речь просмотрите, пожалуйста, следующий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int print(int arg1, int arg2) {
    std::cout << "Первый аргумент: " << arg1 << std::endl;
    std::cout << "Второй аргумент: " << arg2 << std::endl;
    return arg1 + arg2;
}
 
template <typename F, typename ...Args>
class Adder {
    using Result = typename std::result_of<const F& (Args...)>::type;
        Result result;
public:
    void printSumm(const F& foo,Args... args) {
        result = foo(args...);
        std::cout << "Результат вычисления: " << result << std::endl;
    }
};
 
int main(int argc, char* argv[]) {
    Adder <decltype(print), int, int> adder;
    adder.printSumm(print, 3, 5);
    return 0;
}
Необходимо, чтобы тип Result соответствовал типу возвращаемого значения функции print, то есть int. Приведённая здесь реализация, которая была придумана мной, не удовлетворяет требованиям задачи. Хотелось бы, чтобы в качестве параметра использовалась только ссылка на функцию, т.е
C++
1
Adder <decltype(print)> adder;
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2015, 13:11
Ответы с готовыми решениями:

Назначение возвращаемого значения функцией
Уважаемые форумчане, помогите пожалуйста ответить на пару тройку вопросов:wall:...

Тип возвращаемого значения
Доброе время суток! Возникла необходимость написать программу на С++. Но я в ...

Тип возвращаемого значения
Здравствуйте, вопрос может тупой, но почему в данном конкретном случае функция...

Тип возвращаемого значения
Здравствуйте! Подскажите, пожалуйста, почему при нахождении арифметического...

Может ли третий проверка возвращаемого функцией значения влиять на результат линковки?
Не торопитесь с ответом. Я тоже так думал. Кропаем dll: //dllka.cpp...

4
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.05.2015, 13:42 #2
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

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
#include <iostream>
#include <type_traits>
#include <boost/function_types/result_type.hpp>
 
int print(int arg1, int arg2) { return arg1 + arg2; }
 
template <typename F>
class Adder {
   using Result = //typename std::result_of<F>::type;
                  typename boost::function_types::result_type<F>::type;
 
   Result result;
public:
   template <typename ... Args>
   void printSumm(const F& foo, Args... args)
   {
      result = foo(args...);
      std::cout << "Result: " << result << std::endl;
   }
};
 
int main()
{
   Adder <decltype(print)> adder;
   adder.printSumm(print, 3, 5);
   return 0;
}
1
korrav
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 21
05.05.2015, 13:55  [ТС] #3
Замечательно! Спасибо! Ради интереса изучу как реализована boost::function_types::result_type.
0
DrOffset
7964 / 4630 / 1125
Регистрация: 30.01.2014
Сообщений: 7,530
05.05.2015, 15:38 #4
korrav, такая простая задачка решается и без бустов
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
int print(int arg1, int arg2) {
    std::cout << "Первый аргумент: " << arg1 << std::endl;
    std::cout << "Второй аргумент: " << arg2 << std::endl;
    return arg1 + arg2;
}
 
template <typename F>
class Adder;
 
template <typename R, typename ...Args>
class Adder<R(Args...)>
{
    using Result = R;
    using Func   = R(Args...);
 
    Result result;
public:
    void printSumm(const Func & foo, Args... args) {
        result = foo(args...);
        std::cout << "Результат вычисления: " << result << std::endl;
    }
};
 
int main(int argc, char* argv[]) {
    Adder <decltype(print)> adder;
    adder.printSumm(print, 3, 5);
    return 0;
}
1
korrav
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 21
06.05.2015, 02:22  [ТС] #5
Спасибо!
0
06.05.2015, 02:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2015, 02:22

Тип возвращаемого значения функции
есть класс point. в другом классе есть член функция point GetUpperLeft() {...

Тип возвращаемого значения ifstream::tellg()
tellg якобы возвращает std::streampos, а если перейти к определению typedef...

Функции (вызов и тип возвращаемого значения)
Доброй ночи! Кто может помочь мне по следующей задачей? Есть динамический...


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

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

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