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

时间:2013-01-18 11:13:12

标签: c++ templates member-function-pointers

我有一个如下所述的简单课程。

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。

2 个答案:

答案 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); }