Указатель для ссылки на функцию-член класса

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

#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, определить класс алгоритма на основе модели - это обходной путь. Однако я хочу сделать модель и алгоритм независимыми друг от друга. Так что, если я использую тот же алгоритм в другой модели, мне не нужно возиться с кодом в моем классе алгоритмов. По той же причине я не хочу дружить с классом модели и классом алгоритма или делать что-либо специально для класса модели в классе алгоритма.


person Chong    schedule 16.01.2014    source источник


Ответы (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
    }
};
person Jarod42    schedule 16.01.2014