DefaultFunction
является функцией-членом SomeClass
. Функция-член вызывается для некоторого экземпляра SomeClass
. Эта функция принимает «скрытый» указатель на экземпляр SomeClass
в качестве первого добавления параметра к int
. Таким образом, функция-член - это не то же самое, что свободная функция.
Ваш someFunction
является объектом boost::function
, поэтому он является оберткой для вызываемого объекта. Ваши требования к этому объекту: take int и возвращает int. Чтобы присвоить DefaultFunction
(как функцию-член) для someFunction
, вам нужно создать этот вызываемый объект. Здесь вам нужно указать, для какого экземпляра SomeClass
этот объект будет вызываться, для этого используйте boost::bind
:
SomeClass::SomeClass(){
someFunction=boost::bind(&SomeClass::DefaultFunction, this, boost::placeholders::_1);
}
В приведенном выше коде вы создаете вызываемый объект, который будет вести себя как
struct unnamedClass {
SomeClass* sc;
unnamedClass (SomeClass* sc) : sc(sc) {} // here sc is this of SomeClass
int operator()(int arg)
{
return sc->DefaultFunction(arg);
}
};
, поэтому, когда вы вызываете someFunction(10)
, он принимает 10 в качестве аргумента и вызывает DefaultFunction
для текущего this
экземпляра.
Это
void SomeClass::SetFunction(int (*f)(int i)){
someFunction=f;
}
работает, потому что f
является бесплатной функцией, которая не принимает скрытый указатель на экземпляр класса.