У меня есть простой класс, как указано ниже.
typedef mytype int;
typedef mytype2 float;
class A {
.
.
void run (mytype t) { .... do something with t ..... }
.
.
}
У меня есть другой класс, в котором я создал шаблонную функцию (чтобы сделать ее независимой от класса A), которая должна принимать указатель на функцию (т.е. запуск метода класса A) вместе со своим параметром.
class B {
.
template< // how it should be defined >
void myfunction ( // how parameters will be passed ) { }
Водитель должен быть что-то вроде
A a
B b
C c
b.myfunction(&A::run, mytype); // Or how it should be called
b.myfunction(&B::run, mytype2); // - do -
Идеи / Код / Причина?
С Уважением,
Фаррух Аршад.
class B {
template <typename T>
void myfunction(void (T::*func)(mytype), mytype val) {
(some_instance_of_T.*func)(val); // or whatever implementation you want
}
};
Параметр func
определяется как указатель на нестатическую функцию-член T
, принимая mytype
и возвращаясь void
,
Вам нужно получить some_instance_of_T
откуда-то Какой экземпляр A
вы хотите myfunction
звонить func
на? Если это объект вызывающего a
то либо myfunction
нужен другой параметр для подачи a
или использовать bind
как говорит Алекс, и определите:
class B {
template <typename Functor>
void myfunction(Functor f, mytype val) {
f(val); // or whatever implementation you want
}
};
или если вы хотите ограничить тип того, что пользователь передает:
class B {
void myfunction(std::function<void(mytype)> f, mytype val) {
f(val); // or whatever implementation you want
}
};
использование std::bind
;
using namespace std::placeholders;
b.myfunction(std::bind(&A::run, a, _1), mytype);
Определите B следующим образом
class B {
.
template<typename Callable, typename Arg>
void myfunction (Callable fn, Arg a) {fn(a); }
Я не уверен, что хорошо понял ваш вопрос, но вы можете попробовать использовать std::function
а также std::bind
Например:
#include <functional>
#include <iostream>
struct A
{
void run(int n)
{
std::cout << "A::run(" << n << ")" << std::endl;
}
};
struct B
{
typedef std::function< void( int ) > function_type;
void driver(function_type f, int value)
{
std::cout << "B::driver() is calling:" << std::endl;
f( value );
}
};int main()
{
A a;
B b;
b.driver(
std::bind<void>(&A::run, &a, std::placeholders::_1),
10
);
}
Выход:
B :: driver () вызывает:
A :: бежать (10)