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

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

Войти
Регистрация
Восстановить пароль
 
korrav
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 21
#1

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

05.05.2015, 13:11. Просмотров 280. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос По ссылке на функцию получить тип возвращаемого этой функцией значения (C++):

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

Тип возвращаемого значения - C++
Здравствуйте! Подскажите, пожалуйста, почему при нахождении арифметического выражения, функция main должна возвращать значение типа int,...

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

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

Может ли третий проверка возвращаемого функцией значения влиять на результат линковки? - C++
Не торопитесь с ответом. Я тоже так думал. Кропаем dll: //dllka.cpp #include &lt;unknwn.h&gt; void f(){ //Размер взят от...

Тип возвращаемого значения функции - C++
есть класс point. в другом классе есть член функция point GetUpperLeft() { return itsUpperLeft; } эта член-функция исходя из типа...

4
DiffEreD
1432 / 769 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.05.2015, 13:42 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
7471 / 4467 / 1015
Регистрация: 30.01.2014
Сообщений: 7,321
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
Привет! Вот еще темы с ответами:

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

Функции (вызов и тип возвращаемого значения) - C++
Доброй ночи! Кто может помочь мне по следующей задачей? Есть динамический массив в main(): double *m=new double ; Есть функция...

Тип возвращаемого значения не соответствует типу функции - C++
double get_left (void); { double e, c; e = ex - a; c = cx - r; return max(e, c); } double get_right (void); ...

Почему у функции main() тип возвращаемого значения - int? - C++
Здравствуйте! В языке C# main &quot;свободный&quot;: void main (). Логично, поскольку программа - это набор операторов, которые в общем смысле ничего...


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

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

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