模板函数将参数函数指针指向类方法

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::functionstd::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++ 使用指向相同函数的指针作为模板参数是不是总是会导致相同的实例化?

typedef 模板,接受指向 const 和非 const 函数的指针

向模板类传递通用方法的指针。