Вы пробовали bind
?
// C++0x update
struct test {
void f( int, int, int, int );
};
int main()
{
std::function<void (int,int,int,int)> fn;
test t;
fn = std::bind( &t::f, &t,
std::placeholders::_1,
std::placeholders::_2,
std::placeholders::_3,
std::placeholders::_4 );
fn( 1, 2, 3, 4 ); // t.f( 1, 2, 3, 4 )
}
Я оставил полную квалификацию всех элементов, но std::placeholders
, примененное столько раз, на самом деле не помогает читабельности ... Я думаю, using std::placeholders
не повредит вообще:
using std::placeholders;
fn = std::bind( &t::f, &t, _1, _2, _3, _4 );
РЕДАКТИРОВАТЬ: чтобы приблизить его к коду вопроса, чтобы было яснее, что он имеет те же функции, что и исходный код:
typedef std::function<int(int,int,int,int)> TheFn;
class C {
int MemberFn( int, int, int, int ) { return 0; }
public:
int MemberFn2(int,int,int,int) { return 2; }
TheFn getFn() {
using std::placeholders;
return std::bind( &C::MemberFn, this, _1, _2, _3, _4 );
}
};
int main() {
C instance;
TheFn fn1 = instance.getFn();
std::cout << fn1( 1, 2, 3, 4 ) << std::endl; // 0
using std::placeholders;
TheFn fn2 = std::bind( &C::MemberFn2, &instance, _1, _2, _3, _4 );
std::cout << fn2( 1, 2, 3, 4 ) << std::endl;
}
Как вы можете видеть в обоих случаях, вы делаете то же самое. Я использовал приватные и публичные методы для примера, чтобы показать, что когда вы bind
, уровень доступа к методу-члену проверяется в месте привязки, а не в месте вызова. Так что даже если MemberFn
является закрытым внутри класса, вы можете вызвать его через связанный функтор. Если член общедоступный, вы можете связываться вне класса.