но с учетом того, что я хочу использовать функции только без указания аргумента
Это просто так не работает.Вы когда-нибудь задумывались, тогда когда вы помещаете объявления функций в заголовок, почему вы должны записать параметры по умолчанию в заголовок и не можете поместить его в определение в исходном файле реализации?
Это потому, чтопараметры по умолчанию на самом деле не «встроены» в функцию, а используются компилятором для дополнения вызова функции этими параметрами в месте вызова, где эти параметры опущены. (РЕДАКТИРОВАТЬ: Кроме того, как @Aconcagua так остро заметил в комментарии, так как параметры по умолчанию обычно определяются как часть объявления функции заголовка, любое изменение значений по умолчанию требует полной перекомпиляции любого модуля компиляции, который включал эти заголовки, ergo объявления функций, чтобы изменения действительно вступили в силу!)
Хотя вполне возможно сделать какое-то очень странное безумие приведения типов для создания массива таких указателей на функции, в конце концов у вас будетприведение к исходной сигнатуре вызова функции, чтобы не вызывать неопределенное поведение.
Во всяком случае вам придется связать указатель функции вместе с набором параметров по умолчанию в некотором типе, который абстрагирует вызывающий, предоставляет параметры и снаружи предлагает полиморфный интерфейс.Таким образом, у вас будет std::vector<function_binder>
или function_binder[]
, где связыватель функции имеет operator()
, который вызывает функцию.
Но когда вы делаете связывание в первую очередь, вы можете связать его ванонимная функция, т.е. лямбды.Во время лямбда-инстанции параметры по умолчанию связаны.
std::vector<void(*)()> fvec = {
[]{ func0(); },
[]{ func1(); },
[]{ func2(); },
}