Как мне перебрать указатель на функцию в C ++ - PullRequest
4 голосов
/ 07 апреля 2010

Во-первых, я очень плохо знаком с указателями на функции и их ужасным синтаксисом, так что играйте хорошо.

Я пишу метод для фильтрации всех пикселей в моем растровом изображении на основе функции, которую я передаю. Я написал метод для разыменования его и вызова в пиксельном буфере, но мне также нужен метод-обертка в моем растровом классе он берет указатель на функцию и передает его. Как мне это сделать? Какой синтаксис? Я немного озадачен.

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

struct sColour
{
    unsigned char r, g, b, a;
};

class cPixelBuffer
{
private:
    sColour* _pixels;
    int _width;
    int _height;
    int _buffersize;
public:
    void FilterAll(sColour (*FilterFunc)(sColour));
};


void cPixelBuffer::FilterAll(sColour (*FilterFunc)(sColour))
{
    // fast fast fast hacky FAST
    for (int i = 0; i < _buffersize; i++)
    {
        _pixels[i] = (*FilterFunc)(_pixels[i]);
    }
}

class cBitmap
{
private:
    cPixelBuffer* _pixels;
public:
    inline void cBitmap::Filter(sColour (*FilterFunc)(sColour))
    {
           //HERE!!
    }
};

Ответы [ 3 ]

4 голосов
/ 07 апреля 2010

Если я понимаю, что вы хотите:

inline void cBitmap::Filter(sColour (*FilterFunc)(sColour))
{
       _pixels->FilterAll( FilterFunc);
}

Зачастую работа с указателями на функции проще для чтения, если вы используете typedef для типа указателя на функцию (на самом деле ваш не так уж плох - они могут очень сильно ухудшиться):

struct sColour
{
    unsigned char r, g, b, a;
};

typedef 
sColour (*FilterFunc_t)(sColour);   // typedef for a FilterFunc

class cPixelBuffer
{
private:
    sColour* _pixels;
    int _width;
    int _height;
    int _buffersize;
public:
    void FilterAll(FilterFunc_t FilterFunc);
};


void cPixelBuffer::FilterAll(FilterFunc_t FilterFunc)
{
    // fast fast fast hacky FAST
    for (int i = 0; i < _buffersize; i++)
    {
        _pixels[i] = (*FilterFunc)(_pixels[i]);
    }
}

class cBitmap
{
private:
    cPixelBuffer* _pixels;
public:
    inline void cBitmap::Filter(FilterFunc_t FilterFunc)
    {
           _pixels->FilterAll( FilterFunc);
    }
};
3 голосов
/ 07 апреля 2010

Библиотеки Boost могут сделать вашу жизнь проще здесь.см. функция повышения .
Например, вот функция, которая принимает функцию обратного вызова, которая принимает два int с и возвращает int:

void do_something( boost::function<int (int, int)> callback_fn );

Затем онаможет использоваться как обычная функция:

int result = callback_fn(1,2);

Передать ее на do_something следующим образом:

boost::function<int (int, int)> myfn = &the_actual_fn;
do_something(myfn);

С помощью функции Boost вы также можете легко передавать функции-члены класса (см. boost bind ).
Удачи в вашей программе.

2 голосов
/ 07 апреля 2010

Вы можете сделать вещи более понятными, используя typedef для вашего типа указателя функции:

typedef sColour (*FilterFunc_t)(sColour)
void FilterAll(FilterFunc_t FilterFunc);

Передача переменной, содержащей указатель функции, в другую функцию работает так же, как и передача любой другой переменной:

inline void cBitmap::Filter(FilterFunc_t FilterFunc) {
   FilterAll(FilterFunc);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...