#c
#c
Вопрос:
Если у меня есть указатель на функцию
MyFunctionPointer myFunctionPointer;
Я могу передать ему параметры типа:
myFunctionPointer(1,2);
Я хочу сделать что-то подобное, но вызвать определенную функцию для объекта. В настоящее время у меня есть что-то вроде этого:
if(case1)
myObject.Case1();
else if(case2)
myObject.Case2();
Вместо этого, есть ли какой-либо способ сделать что-то вроде:
myObject.myFunctionPointer();
?
Спасибо,
Дэвид
Комментарии:
1.
boost::bind
имеет удобные оболочки для этого.2. Хорошая ссылка по теме: codeproject.com/KB/cpp/FastDelegate.aspx
Ответ №1:
Проверьте это: http://www.goingware.com/tips/member-pointers.html . Может быть, это поможет вам?
В кавычках:
class Foo
{
public:
double One( long inVal );
double Two( long inVal );
};
int main()
{
double (Foo::*funcPtr)( long ) = amp;Foo::One;
Foo aFoo;
double result =(aFoo.*funcPtr)( 2 );
}
Комментарии:
1. Ах да, основная функция ссылки в кавычках имела «void» в качестве возвращаемого типа и все равно возвращала ноль. Посмотрите исходную ссылку и измените возвращаемый тип на «int». Это должно помочь. Спасибо, что обратили внимание. 🙂
Ответ №2:
Если вы объявляете указатель на функцию как функцию-член класса, то да, вы можете назначить свою функцию этой функции-члену, а затем позже вызвать функцию.
итак, если вы объявите указатель на функцию в своем классе
int (*foo)(int) = NULL; // takes int arg, returns int
как только вы назначите метод функции, вы можете вызывать его по своему усмотрению:
myObject.foo(42);
например
class myfoo
{
public:
int (*foo)(int);
};
int myfoofunc(int n)
{
return n/2;
}
...
myfoo f;
f.foo = myfoofunc;
cout << f.foo(2) << endl; // would output 1
Ответ №3:
Если обе функции-члены имеют одинаковую подпись, вы можете объявить указатель на функцию-член
return_type (CMyClass::*variable)(paramtype1, paramtype2) = amp;CMyClass::Case1;
и вызовите ее как
return_type ret = (myObject.*variable)(param1, param2);
Комментарии:
1. Смотрите это для получения дополнительной информации.