шаблонная функция, принимающая аргумент указателя на метод класса

У меня есть простой класс, как указано ниже.

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 -

Идеи / Код / Причина?

С Уважением,
Фаррух Аршад.

2

Решение

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
}
};
3

Другие решения

использование 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); }
2

Я не уверен, что хорошо понял ваш вопрос, но вы можете попробовать использовать 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)

1
По вопросам рекламы [email protected]