2014-01-16 3 views
0

По сути, я хочу передать ссылку функции-члена в другую функцию другого класса. Пример кода такой:Указатель для ссылки на функцию-член класса

#include<iostream> 

using namespace std; 

class algorithm 
{ 
    void (*ODE)(double * timeDeri, double * var); 
    void simulation() 
    { 
     //use ODE to do simulation 
    } 
    parent(void (*someODE)(double * timeDeri, double * var)) 
    { 
     ODE=someODE; 
    } 
} 

class model:algorithm 
{ 
    void specificODE(double * timeDeri, double * var) 
    { 
     //detail of the ODE 
    } 
    model() : algorithm(specificODE) 
    { 
     //some initialization 
    } 
} 

int main() 
{ 
    model a; 
    a.simulation(); 
} 

Теперь я знаю, что этот код не будет работать. Поскольку указатель на функцию можно использовать только для статической функции. Однако, по некоторым практическим причинам, я не могу сделать specificODE статическим. Поэтому я задаюсь вопросом, может ли какой-то указатель помочь мне в этом. Может ли кто-нибудь помочь?

PS1, я проверил указатель на функцию-член. Этот указатель полезен, если я хочу указать на функцию-член в том же классе. Однако в этом случае указатель должен иметь возможность указывать на функцию-член другого класса.

PS2, Определение класса алгоритма на основе модели - это работа. Тем не менее, я хочу сделать модель и алгоритм независимыми друг от друга. Так что, если я использую тот же алгоритм на другой модели, мне не нужно возиться с кодом в моем классе алгоритмов. По той же причине я не хочу подружиться с классом модели и классом алгоритмов или делать что-либо специально для класса модели в классе алгоритмов.

ответ

1

Правильный синтаксис для функции члена является

void (algorithm::*ODE)(double * timeDeri, double * var) 

Как вы упоминаете, что вам нужно на самом деле быть универсальным и использование:

void (T::*ODE)(double * timeDeri, double * var) 

Таким образом, вы можете использовать CRTP для этого:

template <typename T> 
class algorithm 
{ 
public: 
    // You may use typedef: 
    // typedef void (T::*ODE_T)(double * timeDeri, double * var); 
    // ODE_T ODE; 

    void (T::*ODE)(double * timeDeri, double * var); 

    void simulation() 
    { 
     double d1, d2; 

     (static_cast<T*>(this)->*ODE)(&d1, &d2); 
     //use ODE to do simulation 
    } 

    //explicit algorithm(ODE_T someODE) 
    explicit algorithm(void (T::*someODE)(double * timeDeri, double * var)) 
    { 
     ODE = someODE; 
    } 
}; 

class model : private algorithm<model> 
{ 
    friend algorithm<model>; // As you inherit privately from algorithm<T>. 
public: 
    void specificODE(double * timeDeri, double * var) 
    { 
     //detail of the ODE 
    } 
    model() : algorithm(&model::specificODE) 
    { 
     //some initialization 
    } 
}; 
Смежные вопросы