Как сохранить указатель на функцию в векторе? - PullRequest
2 голосов
/ 21 сентября 2010

как: vector<void *(*func)(void *)> ...

Ответы [ 2 ]

5 голосов
/ 21 сентября 2010

Вы можете объявить вектор указателей на функции, принимая один аргумент void * и возвращая void * следующим образом:

#include <vector>
std::vector<void *(*)(void *)> v;

Если вы хотите сохранить указатели на функции с различными прототипами, он становитсяболее сложный / опасный.Затем вы должны привести функции к нужному типу при добавлении их в вектор и преобразовать их обратно в исходный прототип при вызове.Просто пример того, насколько уродливым это выглядит:

#include <vector>

int mult(int a) { return 2*a; }

int main()
{
    int b;

    std::vector<void *(*)(void *)> v;
    v.push_back((void *(*)(void *))mult);
    b = ((int (*)(int)) v[0])(2);        // The value of b is 2.

    return 0;
}

Вы можете использовать typedef для частичного скрытия синтаксиса приведения функций, но все еще существует опасность вызова функции как неправильного типа, что приводит ксбои или другое неопределенное поведение.Так что не делай этого.

0 голосов
/ 14 января 2013

Сохранение функции в векторе может быть сложной задачей, как показано выше.В этом случае, если вы хотите динамически использовать функцию, вы также можете сохранить функцию в указателе , что намного проще.Основным преимуществом этого является то, что вы можете хранить любой тип функции, будь то нормальная функция или параматризованная (имеющая некоторый вход в качестве параметров).Полный процесс описан в приведенной ниже ссылке с примерами ... просто посмотрите ... !!! как мы можем сохранить функцию в указателе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...