模板函数将参数函数指针指向类方法
Posted
技术标签:
【中文标题】模板函数将参数函数指针指向类方法【英文标题】:template function taking argument function pointer to a class method 【发布时间】:2013-01-18 11:13:12 【问题描述】:我有一个简单的类,如下所述。
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 -
想法/代码/原因?
问候, 法鲁克·阿尔沙德。
【问题讨论】:
【参考方案1】: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
。您希望myfunction
调用func
的哪个A
实例?如果是调用者的对象a
,那么myfunction
需要另一个参数来提供a
,或者像Alex 所说的那样使用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
;
【讨论】:
【参考方案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);
【讨论】:
【参考方案3】:我不确定我是否理解您的问题,但您可能想尝试使用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)
【讨论】:
以上是关于模板函数将参数函数指针指向类方法的主要内容,如果未能解决你的问题,请参考以下文章
C++ 使用指向相同函数的指针作为模板参数是不是总是会导致相同的实例化?