Вот декларация:
#include <functional>
class A { ... };
double fA( std::function<double((A::*)(double))> fp) { ... }
что дает мне ошибку
В функции «двойной fA (std :: function)»:
tb.cpp: 32: 8: ошибка: «fp» имеет неполный тип
Хотя нет проблем с
double fA( double ((A::*fp)(double)) ) { ... }
Как правильно указать этот тип в качестве параметра шаблона для std::function
?
Я не совсем уверен, что вы действительно хотите. Аргумент к std::function
должна быть свободной сигнатурой функции, как указано в стандарте:
template<class R, class... ArgTypes>
class function<R(ArgTypes...)>;
Обратите внимание, что аргумент является подписью operator()
это будет предложено объектом функции. Это не может быть указатель на член к другому типу, это просто тип возвращаемого значения и аргументы std::function<>
объект создается.
Дополнительный набор скобок в объявлении функции может указывать, что вы действительно хотите создать std::function
функциональный объект, который принимает в качестве аргумента указатель на член и возвращает double
, Если это так, то подпись аргумента std::function
отсутствует тип возвращаемого значения:
std::function<double (void (A::*)(double))> fp;
Который может быть инициализирован с:
double myfunc( void (A::*mptr)(double) ) {}
// ...
fp = myfunc;
Законченный делать что-то очень похожее на предложение @ chris, код из его примера выглядит следующим образом:
#include <functional>
#include <iostream>
struct S {
void foo() {std::cout << i;};
int i;
};
void bar(std::function<void()> func) {
func();
}
int main() {
S s1, s2;
s1.i = 5;
s2.i = 6;
bar(std::bind(&S::foo, s1));
bar(std::bind(&S::foo, s2));
}