Давайте рассмотрим упрощенный пример:
#include <functional>
template<typename T>
void test_function(std::function<void(T*)> f) {
f(nullptr);
}
void use_int_ptr(int* i);
int main() {
test_function(use_int_ptr);
}
, который не компилируется: T
не может быть выведено как int
. Причина, по которой он работает с void (*f)(T*)
, заключается в том, что T
можно вывести , если передать указатель на функцию, но указатель на функцию не является std::function
.
У вас есть несколько возможные решения. Вы можете вручную указать T
:
test_function<int>(use_int_ptr);
Вместо этого можно передать std::function
, чтобы можно было вывести T
:
test_function(std::function<void(int*)>{use_int_ptr});
// Or in C++17 with CTAD
test_function(std::function{use_int_ptr});
Создать функцию пересылки, которая переносит функцию указатели в std::function
с, как указано выше, необходимо вручную передать std::function
с для других вызываемых объектов:
template<typename T>
void test_function(void f(T*)) {
test_function(std::function<void(T*)>{f});
}
или просто взять любой тип в исходной функции:
template<typename F>
void test_function(F&& f) {
f(nullptr);
}