Один из способов сделать это, хотя и некрасиво, - использовать универсальную таблицу указателей и привести ваши указатели функций к такому универсальному типу (теряя информацию о типах аргументов):
void (*myFunctions[]) () = {
(void (*)())myFirstFunction,
(void (*)())mySecondFunction
};
Но тогда вы должны будете знать, для каждого из указателей, какие аргументы передать соответствующим функциям. Вы можете расширить свою таблицу указателей и создать таблицу из более сложных объектов, которые содержат некоторую переменную перечисления, информирующую об аргументах функции, на которую указывает конкретный указатель.
К сожалению, каждый раз, когда вы захотите использовать функцию из массива, вам нужно будет приводить указатель обратно к указанному типу (и вам придется заботиться о том, чтобы не приводить его неправильно), например так:
((void (*)(int))tab[0])(1);
Для вызова myFirstFunction с x = 1.
Когда я думаю об этом сейчас (после того, как вы изменили вопрос), я прихожу к выводу, что если вам придется вызывать функции по-разному, то нет смысла усложнять все это (таблица поиска), если только нет несколько подписей и множество доступных функций. Вам нужна очень согласованная политика вызовов и действительно мало возможных подписей, чтобы получить красивое решение с таблицей поиска. Нет необходимости упоминать, что произойдет, если вам понадобится хранить указатели на функции-члены или, что еще хуже, на виртуальные.