Вызов определенной функции (указатель на функцию) для объекта

#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. Смотрите это для получения дополнительной информации.