单个函数指针可以指向多个类的成员函数

时间:2012-03-03 09:56:27

标签: c++ function-pointers class-members member-pointers

以下是我的申请所提出的要求。我有一个A类,接受一个函数指针说cFunc,基本上在我的A实现中,我有多次调用cFunc。

cFunc指针本身应根据应用程序指向不同的函数。因此,对于每个应用程序,我创建一个具有与cFunc相同的函数定义的类,但是我不能将类的成员函数赋给此指针

class A {
    typedef double (*Def_CFunc)(std::vector<double>);
    A(Def_CFunc _cFunc) { // Some implementation}
    // Other Functions
};

class B { double someFunc(std::vector<double> b); };
class C { double someOtherFunc(std::vector<double> a); };

int main () {
    B firstObj;
    C secondObj;

    // Depending upon the situation, I want to select class B or C
    double (*funcPointer)(std::vector<double>) = firstObj.someFunc; // Error in this line of code

    A finalObj(funcPointer);
}

那么如何使得任何具有给定格式的成员函数的类都可以用来初始化类A?

4 个答案:

答案 0 :(得分:2)

我不确定你的要求是什么,但看起来你想要一个interface(或C ++术语中的抽象基类)。

如果BC都继承自公共基类,则可以将指针传递给此基类并在其上调用函数:

class I { virtual double func(std::vector<double> a) = 0; }
class B : public I { double func(std::vector<double> a); };
class C : public I { double func(std::vector<double> a); };

您可以将I*指针传递给A,然后使用i->func

答案 1 :(得分:1)

Pointer to member function具有与指向普通函数的指针不同的语法,并且只能指向一个给定类的方法。为了能够指向不同类中的方法,请使用boost::function,或者如果C ++ 11可用,请使用std::function。这些可以包含给定签名的任何方法或功能。

答案 2 :(得分:1)

你需要的是std::function以及std::bind或lambda表达式(或者前两个的Boost等价物),因为成员函数指针不允许你这样做。

答案 3 :(得分:0)

你可以使用std :: bind + std :: function来做到这一点。让我们编写一些模板类包装器,它将任何静态类型作为输入。然后在自由函数switch_obj中使用此包装器。用法非常简单。

typedef std::function<double(std::vector<double>)> my_foo;

template<class C>
struct switcher
{
    static my_foo convert(C* obj)
    {
        return my_foo( std::bind(&C::someFunc,obj,std::placeholders::_1) );
    }
};

template<class T>
my_foo switch_obj(T* obj)
{
    return switcher<T>::convert(obj);
}

void main()
{
    B firstObj;
    C secondObj;

    auto f =  switch_obj(&firstObj);
    A a(f);
}