我有一个如下所述的简单课程。
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 -
想法/代码/原因?
此致 Farrukh Arshad。
答案 0 :(得分:3)
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
,或者如Alex所说的那样使用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
}
};
或者如果您想约束用户传入的类型:
{{1}}
答案 1 :(得分:2)
使用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); }