Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1454 / 791 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
1

Создать класс, в котором можно сохранить любой вызываемый объект или функцию

11.08.2014, 14:27. Показов 800. Ответов 5
Метки нет (Все метки)

Возникла идея создать класс, в котором можно сохранить любой вызываемый объект или функцию. Что то наподобие std::function, но только не параметризирован, с использованием технологии Type Erasure. Вот такой первый набросок получился (естественно не рабочий):
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <boost/type_traits/function_traits.hpp>
 
class function_wrapper
{
   struct base_holder
   {
      virtual ~base_holder() {}
 
      template <typename... Args>
      return_type call(Args&&... args) const = 0;
   };
 
   template <typename F>
   struct func_holder : base_holder
   {
      F f;
      func_holder(F&& f_) : f(std::move(f_)) {}
 
      template <typename... Args>
      return_type call(Args&&... args) const
      {
         return f(std::forward<Args>(args)...);
      }
   };
 
   std::shared_ptr<base_holder> holder;
 
public:
   template <typename T>
   explicit function_wrapper(T&& t) : holder(new func_holder<T>(std::forward<T>(t)))
   {
      //этот тип надо както сохранить и использовать в качестве возвращаемого
      //типа в operator()
      typedef typename boost::function_traits<T>::result_type return_type;
   }
 
   template <typename... Args>
   return_type operator ()(Args&&... args) const
   {
      return holder->call(std::forward<Args>(args)...);
   }
};
 
////////////////////////////////////////////////////////////////////////////////
 
void foo1(const std::string& s, int val)
{
   std::cout << s << " " << val << "\n";
}
 
int foo2(const std::string& s, int val)
{
   std::cout << s << "\n";
   return val;
}
 
int main()
{
   std::vector<function_wrapper> fw;
   fw.push_back(function_wrapper(foo1));
   fw.push_back(function_wrapper(foo2));
 
   std::cout << fw[0]("return void", 100);
   auto val = fw[1]("return int", 10);
   std::cout << val << "\n";
 
   std::cout << "Bye... :-) \n\n";
   return 0;
}
В первую очередь интересует как можно сохранить возвращаемый тип ф-ции для вызова operator(). Еще есть идея хранить в func_holder тот же самый std::function, но снова возникает проблема определения возвращаемого типа. Ну и вообщем, какие у кого мнения по данному вопросу будут?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2014, 14:27
Ответы с готовыми решениями:

Можно-ли наследовать класс, в котором определен объект текущего класса?
Подскажите, пожалуйста, можно-ли делать так: class A { public: B objB; }; class B :...

Можно ли как то запустить функцию или класс которая находится ниже чем исполняемая функция или класс?
Можно ли как то запустить функцию или класс которая находится ниже чем исполняемая функция или...

Lazarus чистить любой объект в котором пытаемся рисовать
В общем такая ситуация, в чем бы мы не пытались рисовать, будь то пентбокс, панель или сама форма...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня...

5
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2014, 14:40 2
C++
1
2
3
4
5
6
7
   struct base_holder
   {
      virtual ~base_holder() {}
 
      template <typename... Args>
      return_type call(Args&&... args) const = 0;
   };
Это невозможно, т.к. return_type здесь просто негде узнать и известен он должен быть на этапе компиляции.
1
1454 / 791 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.08.2014, 15:09  [ТС] 3
Разве только что тогда параметризировать function_wrapper списком всевозможных возврвщаемых типов и возвращать какой нибудь any или variant.
0
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2014, 15:23 4
DiffEreD, Ну да, возможно. Буст ведь тоже не идиоты пишут, а т.к. any не имеет conversion оператора, но имеет шаблонные функции вида any_cast, делаем вывод, что такой трюк реализовать невозможно.
0
Каратель
Эксперт С++
6601 / 4020 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.08.2014, 16:53 5

Не по теме:

Цитата Сообщение от DiffEreD Посмотреть сообщение
технологии Type Erasure
type erasure это метод, прием, идиома, но не технология



Добавлено через 6 минут
по теме:
как вариант навешивать callback в который будет пихатся результат
Абстракция вызова функции
2
710 / 282 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
11.08.2014, 21:30 6
Цитата Сообщение от DiffEreD Посмотреть сообщение
. Что то наподобие std::function, но только не параметризирован, с использованием технологии Type Erasure
А зачем? Я вот не понимаю, это что-то сродни мазохизму что-ли? Ну, т.е. нравится, когда ошибки происходят в рантайме, а не в компайл-тайм?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2014, 21:30

Есть хоть один язык программирования, в котором переменную или функцию можно объявить после её использования?
Хочу в своём такое реализовать, но так значительно увеличится скорость компиляции. Не знаю, стоит...

Можно ли представить класс как функцию или процедуру
Кто может разжевать, а точнее указать где их применять, по книгами не совсем понятно(Шилтд, Фленов)...

Как заставить объект "Дерево" двигаться мышкой? Или любой другой объект
Добрый вечер. Не могу заставить &quot;Дерево&quot; двигаться при помощи мышки. Как это сделать? Сам код:...

Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует интерфейс
Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует...

Составить алгоритм, в котором после ответа 4 вопроса можно угадать любой загаданный месяц.
Нужно составить алгоритм в котором всего четыре вопроса, ответы на которые (да/нет), после ответа...


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

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

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