2016-06-01 3 views
1

Я пытаюсь передать метод класса другому методу класса с использованием шаблона и не могу найти ответа о том, как это сделать (нет C++ 11, boost ok) :C++ метод передачи класса в качестве аргумента метода класса с шаблонами

Я упростил задачу ядра до:

class Numerical_Integrator : public Generic Integrator{ 
    template <class T> 
    void integrate(void (T::*f)()){ 
     // f(); //already without calling f() i get error 
    } 
} 

class Behavior{ 
    void toto(){}; 

    void evolution(){ 
     Numerical_Integrator my_integrator; 
     my_integrator->integrate(this->toto}; 
} 

я получаю как ошибку:

error: no matching function for call to ‘Numerical_Integrator::integrate(<unresolved overloaded function type>)’this->toto); 
note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘void (Behavior::*)()’ 

Спасибо.

Бонус: Как насчет аргументов?

class Numerical_Integrator{ 
    template <class T, class Args> 
    double integrate(void (T::*f)(), double a, Args arg){ 
     f(a, arg); 
    } 
} 

class Behavior{ 
    double toto(double a, Foo foo){ return something to do}; 

    void evolution(){ 
    Foo foo; 
    Numerical_Integrator my_integrator; 
    my_integrator->integrate(this->toto, 5, foo}; 
} 
+2

[Функция ускорения] (http://www.boost.org/doc/libs/1_61_0/doc/html/function.html) и [Boost bind] (http://www.boost.org/doc/ ЛИЭС/1_61_0/ЛИЭС/привязывать/DOC/HTML/bind.html)? Или взгляните на [стандартную библиотеку алгоритмов] (http://en.cppreference.com/w/cpp/algorithm) и посмотрите, как они обрабатывают «предикаты»? –

+0

Для чего вам нужен T? Проверка? – thorsan

+0

'f (a, arg);' <- вам также нужен объект, который будет действовать как 'this' в функцию. – coyotte508

ответ

6

Ваш вопрос не в том, чтобы передать метод класса как часть параметра шаблона.

Ваш вопрос действительно о правильном вызове метода класса.

Следующая не-шаблон эквивалентен не будет работать:

class SomeClass { 

public: 

    void method(); 
}; 

class Numerical_Integrator : public Generic Integrator{ 
    void integrate(void (SomeClass::*f)()){ 
     f(); 
    } 
} 

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

class Numerical_Integrator : public Generic Integrator{ 
    void integrate(SomeClass *instance, void (SomeClass::*f)()){ 
     (instance->*f)(); 
    } 
} 

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

+0

Спасибо за ваш ответ. Однако использование void integrate (экземпляр SomeClass *, void (SomeClass :: * f)()) все равно дает ту же ошибку: неизвестное преобразование для аргумента 2 из '<неразрешенный перегруженный тип функции>' в 'void (Behavior :: *)() ' – Napseis

+1

Правильный синтаксис для получения указателя на метод - '& Class :: method'. –

+0

фантастический, он компилируется сейчас. Где я могу найти объяснения по этому поводу? Спасибо – Napseis