Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2011, 13:25   #1
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию Указатели на функцию

Можно ли как-то без непосредственного явного указания функции сделать указатель на функцию?
Проблема вот в чем: хочу сделать класс, отвечающий за процессы(функции) в программе. В классе есть динамический массив указателей на функции, выполняющих процессы. Но по идее каждая функция может принимает определенные аргументы, отличные от других.
Пытался сделать через void* func, но, сдется мне, фигня это. К тому же, не работает.
Как можно это реализовать? Направьте мысль
SteAlzzer вне форума Ответить с цитированием
Старый 05.11.2011, 13:53   #2
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от SteAlzzer Посмотреть сообщение
Но по идее каждая функция может принимает определенные аргументы, отличные от других.
Так можно для всех функций сделать один параметр - указатель void*. А этот указатель будет указывать на массив параметров или на структуру:
Код:
 void sumf( void* p)
{
   float *f = static_cast< float*>( p);
   f[2] = f[0] + f[1];
}
...
   float arg[3] = { 3, 5, 0};
   sumf( arg); // вызываем функцию
Можно так же делать указатели на методы класса. И эти методы сделать более общие, а так как это внутренние методы, то они будут иметь доступ к полям класса, где собственно вся информация и хранится, и не нужно будет эту информацию в качестве параметров передавать в функцию.

Последний раз редактировалось An1ka; 05.11.2011 в 14:00.
An1ka вне форума Ответить с цитированием
Старый 05.11.2011, 15:04   #3
SteAlzzer
Пользователь
 
Аватар для SteAlzzer
 
Регистрация: 11.10.2011
Сообщений: 60
По умолчанию

ох подзабыл я шаблоны и приведение))

спасибо, сейчас попробую сделать.
SteAlzzer вне форума Ответить с цитированием
Старый 05.11.2011, 15:16   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Я никак, кроме: предложить не могу.
Код:
#include <iostream>
#include <exception>
#include <vector>
#include <algorithm>

#define with

using namespace std;


struct _Function_base
{ virtual ~_Function_base() {} };

template <typename Fun>
struct Function : _Function_base
{
    Fun data;
    Function(Fun f) : data(f) {}
};

class FunArray
{
public:
    typedef _Function_base* FunPtr;

private:
    vector<FunPtr> _data;

private:
    static void _free_mem(FunPtr &f)
    { delete f; }

public:
    template <typename Fun>
    void add(Fun f)
    { _data.push_back(new Function<Fun>(f)); }

    template <typename Fun>
    Fun call(vector<FunPtr>::size_type p)
    {
        Function<Fun> *f = dynamic_cast<Function<Fun>*>(_data[p]);
        if(!f)
            throw bad_cast();
        return f->data;
    }

    ~FunArray()
    { for_each(_data.begin(), _data.end(), _free_mem); }
};


int sum(int a, int b)
{ return a + b; }

double sum(double a, double b)
{ return a + b; }

void print(const char *s)
{ cout << s << endl; }


int main()
{
    FunArray farr;

    farr.add((int (*)(int, int))sum); // Function sum is overloaded
    farr.add((double (*)(double, double))sum); // Function sum is overloaded
    farr.add(print);

    cout << farr.call<int (*)(int, int)>(0) with (-2, 3) << endl;
    cout << farr.call<double (*)(double, double)>(1) with (-3.12, 2) << endl;
    farr.call<void (*)(const char*)>(2) with ("Hello world!");

    return 0;
}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описать функцию нахождения расстояния между 2-мя точками на плоскости, заданными своими координатами, и функцию .... zzz6 Помощь студентам 2 06.07.2011 08:24
Как передать указатель на функцию в функцию WIN32APIist Общие вопросы C/C++ 1 27.01.2011 10:35
Проблема с пепедачей аргументов в функцию (массивы + указатели) sekator Общие вопросы C/C++ 2 09.08.2010 13:03
Указатели на функцию. prikolist Общие вопросы C/C++ 9 05.06.2009 15:34
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39