3

以下是我的申请提出的要求。我有一个类 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

4 回答 4

2

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

如果两者都B继承C自一个公共基类,则可以传递一个指向该基类的指针并在其上调用函数:

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.

于 2012-03-03T10:04:30.607 回答
1

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

于 2012-03-03T10:01:26.717 回答
1

您需要的是std::function与其中一个std::bind或 lambda 表达式(或前两个的 Boost 等价物)一起使用,因为成员函数指针不允许您这样做。

于 2012-03-03T10:03:32.853 回答
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);
}
于 2012-03-03T10:56:21.923 回答