То, что вы спрашиваете, похоже, передает указатель функции из C в C ++, где функция принимает std::function
в качестве аргумента. Боюсь, что это невозможно, так как C не может передать указатель на функцию, которая принимает std::vector
в качестве аргумента.
При вызове Utility::getInstance().setDelayFunction(delayFunction)
, ctor специализированного std::function
(то есть DelayFunction
) соответствует конструкции из указателя функции. Однако сопоставление не удается, потому что ctor (из DelayFunction
) принимает в качестве второго аргумента специализированный std::function
(т. Е. DelayFunctionCallback
), а не указатель на функцию (т. Е. delay_function_callback_t
).
IЯ думаю, что проблема заключается в реализации std::function
, которая инкапсулирует указатель функции и стирает тип последнего. (См. Как реализована функция std :: function? ). В результате тип C ++ std::function
отличается от указателя на функцию обычного C.
Чтобы обойти это, вы могли бынемного ослабьте C ++ и объявите DelayFunction
принятием void(*)(unsigned)
. Т.е. в файле C ++:
using LogFunction = std::function<void(const char*)>;
using DelayFunction = std::function<void(unsigned, delay_function_callback_t)>;
// ^^^^^^^^^^^^^^^^^^^^^^^^^
РЕДАКТИРОВАТЬ: Re. комментарий о вызове объекта DelayFunction
из C ++ вместо передачи функции lamba в качестве обратного вызова (что не сработало бы с обходным путем, описанным выше, поскольку лямбда-функция может создать только DelayFunctionCallback
, а не delay_function_callback_t
), онаможет быть проще реализовать обратный вызов как статическую функцию-член и использовать ее напрямую:
Utility::getInstance().delay(delay, (delay_function_callback_t)&Utility::next);
Кстати, если Utility
собирается хранить объекты std::function
внутри, то это может бытьболее эффективно передавать по значению, поскольку объекты LogFunction
и DelayFunction
всегда будут создаваться в любом случае (т. е. они имеют значение r в core_init
).