ارسال تابع عضو به عنوان آرگومان ورودی - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

ارسال تابع عضو به عنوان آرگومان ورودی

0 امتیاز

چطور میتونم یک تابع عضو کلاس را به عنوان آرگومان ورودی یک تابع دیگر قرار بدم

f = {&rosenbrock_f, n, &p};

// rosenbrock_f = is member of class

 

وقتی تابع خارخ از کلاس باشه مشکلی پیش نمیاد ولی وقتی rosenbrock_f در یک کلاس تعریف شده باشه عبارت بالا خطا میدهد.

 

سوال شده تیر 25, 1393  بوسیله ی galiwer (امتیاز 33)   4 10 12
دوباره تگ گذاری شد مهر 9, 1393 بوسیله ی BlueBlade

1 پاسخ

+1 امتیاز

برای تعریف فانکشن پوینتر غیر static عضو کلاس به این شکل باید عمل کرد :

returnType(ClassName::*newFunctionName)(InputTypes) 

اگر static باشه مثل تعریف function pointer تابع معمولی هستش :

returnType(*newFunctionName)(InputTypes)

مثال برای ارسال تابع عضو به یک تابع دیگه :

#include <iostream>
#include <string>

class Foo
{
public:
    void memberFunction(char ch){
        std::cout<<ch<<'\n';
    }
    static void staticMemberFunc(int a,std::string b){
        std::cout<<a<<b<<'\n';
    }
};

//accept non-static member function
void func(void (Foo::*newFunctionName)(char) )
{
    Foo foo;
    (foo.*newFunctionName)('a');
}

//accept non-static member function and ordinary functions
void func2(void(*newFunctionName)(int,std::string))
{
    newFunctionName(5,"test");
}

int main()
{
  func(&Foo::memberFunction);
  func2(&Foo::staticMemberFunc);
}

از template هم میشه استفاده کرد :

template<class T>
void func(T newFunctionName)
{
    Foo foo;
    (foo.*newFunctionName)('a');
}

 

پاسخ داده شده تیر 26, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده تیر 26, 1393 بوسیله ی BlueBlade
تابعی که میخواد یک تابع دیگه رو صدا بزنه در یک کتابخانه هست و من دسترسی به کدش ندارم.
در توضیح شما مثل این میمونه که دسترسی به کد func2 نداشته باشیم.
اگر تابع داخل کتابخانه به شکل دوم هستش میتونین یک تابع wrapper بسازین و تابع عضو کلاس رو داخلش صدا بزنین بعد این تابع رو بفرستین به کتابخانه مثلا :
https://ideone.com/YNEFMs
...