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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Error LNK2019: ссылка на неразрешенный внешний символ http://www.cyberforum.ru/cpp-beginners/thread1241088.html
Здрасте, Потребовалось вызвать dll из другой папки, пришлось переписывать импорт под динамический вызов, но тут полезли ероры. myIDirect3DDevice9.obj : error LNK2001: неразрешенный внешний символ ""public: static int (__cdecl* TwBarFunc::TwWindowSize)(int,int)" (?TwWindowSize@TwBarFunc@@2P6AHHH@ZA)" 1>myIDirect3DDevice9.obj : error LNK2001: неразрешенный внешний символ ""public: static...
C++ Односвязный список: В чём разница между struct и class? После неудач работы с Vector, а так же отсутствия (Хотя, скорее всего, я просто плохо искал) хорошей русской документации по нему, решил запилить свой велосипед с самоваром и тёрками. Список состоит из шаблона класса "заголовка" и шаблона класса элемента. В шаблоне ссылка на первый элемент, размер списка и функции по работе со списком. Основу элемента списка составляет указатель на переменную... http://www.cyberforum.ru/cpp-beginners/thread1241053.html
C++ Создание и удаление объекта. Ошибка 134 в Linux
Имеется следующий класс class BoardView { private: Board *brd; void Show(); public:
Как разделить результат, возвращаемый Multi curl? C++
1)Я вообще непонимаю зачем нужна функция static int writer(char *data, size_t size, size_t nmemb, string *buffer) как по мне делает какую-то ерунду. 2) На php курл реализован как-то лучше)) так как результат работы курла возвращает функция curl_exec аналог в с++ curl_easy_setopt который возвращает лишь статус(( ну да ладно вопрос в другом, ниже приведён код с использованием мультикурла,...
C++ Посчитать количество столбцов в строке, разделённых произвольным количеством белых знаков http://www.cyberforum.ru/cpp-beginners/thread1240940.html
Необходимо посчитать количество столбцов в строке, разделённых произвольным количеством белых знаков (кроме знака конца стоки). Также прошу подсказать, как реализовать такую конструкцию символов(буфер? поток?), из который можно было бы читать словами (>>), но при этом каждое следующие читание читало бы следующее слово.
C++ Ссылка на временный объект Наткнулся тут в гугле на одну интересную тему. Как известно, данный код не соответствует стандарту, и не будет скомпилирован многими современными компиляторами: class A { }; void f( A & ) { } подробнее

Показать сообщение отдельно
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.08.2014, 14:27     Создать класс, в котором можно сохранить любой вызываемый объект или функцию
Возникла идея создать класс, в котором можно сохранить любой вызываемый объект или функцию. Что то наподобие 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, но снова возникает проблема определения возвращаемого типа. Ну и вообщем, какие у кого мнения по данному вопросу будут?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru