Вы можете объявить вектор указателей на функции, принимая один аргумент 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
для частичного скрытия синтаксиса приведения функций, но все еще существует опасность вызова функции как неправильного типа, что приводит ксбои или другое неопределенное поведение.Так что не делай этого.