С++ HELP! создать указатель на функцию член класса!

makadi

Как в С++ создать указатель на функцию которая явл. членом класса.
Пробовали
...
double MyClass::My_func (void)
....
a = &MyClass::My_func;
...
При это получили
Can't coinvert double (MyClass::*void) to double(*) (void) in assignment

mkrec

а что будет делать метод, который не знает свой this?
вообще, топик поднимается где-то раз в год в этои разделе

nikita270601

Можно указать ей this при вызове.

nikita270601

вообще, топик поднимается где-то раз в год в этои разделе
да, примерно так и есть.

makadi

Люди вы видно с ВМК! Объясните плиз на уровне слегка продвинутых чайников с физ-фака!

nikita270601

class AClass {
public:
double AFunc {
return 1;
}
};

int main {
double (AClass::* a_method;
a_method = &AClass::AFunc;

AClass an_object;
double result = (an_object.*a_method;
}

makadi

class AClass {
public:
double AFunc {
return 1;
}
double aaa {
double (AClass::* a_method;
a_method = &AClass::AFunc;
// Дополни код плиз
// Здесь нужно передать указатель на ф. AFunc библиотечной процедуре, причем так
// что бы она имела тим double(*) а не double (AClass::*)
}
};
int main {
double (AClass::* a_method;
a_method = &AClass::AFunc;
AClass an_object;
double result = (an_object.*a_method;
}

kokoc88

// Дополни код плиз
// Здесь нужно передать указатель на ф. AFunc библиотечной процедуре, причем так
// что бы она имела тим double(*) а не double (AClass::*)

#include <boost/bind.hpp>
...
boost::bind(&AClass::a_method, &an_object);

Впрочем, это не то что тебе подойдёт...

kokoc88

Это неразрешимая проблемма?
Задача в принципе разрешима. Но проще сделать глобальную или статическую функцию. Идея примерно такая:

#include <iostream>

using namespace std;

double callback(double(*pf
{
return pf;
}

template<class t, int count = 0>
class invoker
{
public:
invoker(t& rc, double (t::*pf : m_rc(rc m_pf(pf)
{
*get_ppc = this;
}

typedef double(*tfunc;

operator tfunc
{
return handler;
}

private:
t& m_rc;
double (t::*m_pf;

invoker(const invoker& ri) : m_rc(ri.m_rc) { }
void operator=(const invoker&) { }

static double handler
{
invoker<t, count>* pc = *get_ppc;
return (pc->m_rc.*pc->m_pf;
}

static invoker<t, count>** get_ppc
{
static invoker<t, count>* pc = NULL;
return &pc;
}
};

#define INPLACE_INVOKER(CLASS_T, CLASS_R, FUNC_P) \
invoker<CLASS_T, __COUNTER__>(CLASS_R, FUNC_P)

class c
{
public:
c : m_f(1.1) { }

double f { return m_f += m_f; }

private:
double m_f;
};

void main
{
c _c;
cout << callback(INPLACE_INVOKER(c, _c, &c::f << endl;
cout << callback(INPLACE_INVOKER(c, _c, &c::f << endl;
cout << callback(INPLACE_INVOKER(c, _c, &c::f << endl;
cin.get;
}

Maurog

твоя библиотека просит указатель на функцию.
поэтому ты туда можешь передать либо указатель на глобальную функцию, либо указатель на статический метод класса.

Sanjaz

А еще можно воспользоваться std::mem_fun

kokoc88

А еще можно воспользоваться std::mem_fun
Как это?

Maurog

неправильно

Sanjaz

Конечно ты не получишь прямой указатель на функцию, но получишь объект, который ведет себя как указатель на функцию. Вот пример из MSDN:

// functional_mem_fun.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>

using namespace std;

class StoreVals
{
int val;
public:
StoreVals { val = 0; }
StoreVals(int j) { val = j; }

bool display { cout << val << " "; return true; }
int squareval { val *= val; return val; }
int lessconst(int k) {val -= k; return val; }
};

int main( )
{
vector<StoreVals *> v1;

StoreVals sv1(5);
v1.push_back(&sv1);
StoreVals sv2(10);
v1.push_back(&sv2);
StoreVals sv3(15);
v1.push_back(&sv3);
StoreVals sv4(20);
v1.push_back(&sv4);
StoreVals sv5(25);
v1.push_back(&sv5);

cout << "The original values stored are: " ;
for_each(v1.begin v1.end mem_fun<bool, StoreVals>(&StoreVals::display;
cout << endl;

// Use of mem_fun calling member function through a pointer
// square each value in the vector using squareval
for_each(v1.begin v1.end mem_fun<int, StoreVals>(&StoreVals::squareval;
cout << "The squared values are: " ;
for_each(v1.begin v1.end mem_fun<bool, StoreVals>(&StoreVals::display;
cout << endl;

// Use of mem_fun1 calling member function through a pointer
// subtract 5 from each value in the vector using lessconst
for_each(v1.begin v1.end
bind2nd (mem_fun1<int, StoreVals,int>(&StoreVals::lessconst 5;
cout << "The squared values less 5 are: " ;
for_each(v1.begin v1.end mem_fun<bool, StoreVals>(&StoreVals::display;
cout << endl;
}

Sanjaz

По-моему, mem_fun гораздо удобнее пользовать чем указатели на функции-члены т.к. не надо писать непонятные выражения типа Result (Type::* _Pm Arg )

kokoc88

По-моему, mem_fun гораздо удобнее пользовать чем указатели на функции-члены т.к. не надо писать непонятные выражения типа Result (Type::* _Pm Arg )
Ты не понимаешь. У человека может быть сторонняя библиотека, которая хочет определённый тип функции. Я тоже сначала предложил boost::bind (что предпочтительнее std::mem_fun но потом подумал и написал, что это решение не подходит автору. Решение, которое может подойти, я привёл выше по теме. Почитай ветку внимательно.

Sanjaz

Про стороннюю библиотеку от автора ничего не было сказано.
Я предложил автору решение, которое мне нравится, а он пусть сам решает, какое решение ему подходит.

kokoc88

Про стороннюю библиотеку от автора ничего не было сказано.
Внимательно читаем:
Здесь нужно передать указатель на ф. AFunc библиотечной процедуре, причем так

Sanjaz

Пардон, не увидел
Оставить комментарий
Имя или ник:
Комментарий: