方法上的指针作为参数

时间:2013-05-30 01:24:58

标签: c++ function-pointers

为避免代码重复,我想把函数指针作为静态方法的参数传递。

我有一个只有静态方法的类(Geo)。其中一种方法(+++ Geo :: traceRay(+++))应该只显示(Geo :: display(+++))一些东西,然后返回一个int。

另一个类(Las)需要使用Geo :: traceRay(+++)方法,但是应该显示(Las :: display(+++))其他方法。 所以我尝试将指向函数参数的指针传递给Geo :: traceRay(+++,指向函数的指针)方法。指向的功能将是正确的“display()”方法。

到目前为止,将第一个指针传递给display()不是问题,但我找不到如何使用第二个指针。

class Geo
{
public:
    static bool display(int pix);
    static int traceRay(int start, int end, bool (*func)(int) = &Geo::display); // no issue with this default parameter
};


class Las
{
public:
    bool display(int pix);
    void run();
};


int Geo::traceRay(int start, int end, bool (*func)(int))
{
    for (int i = start; i < end ; ++i )
    {
        if((*func)(i)) return i;
    }
    return end;
}

bool Geo::display(int pix)
{
    cout << pix*100 << endl;
    return false;
}


bool Las::display(int pix)
{
    cout << pix << endl;
    if (pix == 6) return true;
    return false;
}

void Las::run()
{
    bool (Las::*myPointerToFunc)(int) = &display;       // I can just use display as a non member class, but it should stay a member
    Geo::traceRay(0,10, myPointerToFunc);               // issue here!
}


int main()
{
    Geo::traceRay(0,10); // use the "normal display" = the default one// OK

    Las myLas;
    myLas.run();

    return 0;
}

2 个答案:

答案 0 :(得分:0)

您不能将成员函数指针作为函数指针传递。我认为使Las::display静态不是一种选择。在这种情况下,我建议使用std::function并使用std::bind绑定当前实例:

static int traceRay(int start, int end, std::function<bool(int)> func = &Geo::display);
...
Geo::traceRay(0,10, std::bind(&Las::display, this, std::placeholders::_1));

此外,在这两种情况下,您都可以通过以下方式致电func

func(i);

无需先取消引用它。

答案 1 :(得分:0)

克里斯建议如果这样做的话会很棒。

另一种方法,如果你有几个这样的共享函数,这将是有益的,将使用一个接口(带有虚拟方法显示(+++))和两个实现,将实现的实例放入Geo和Las的每一个问题(或Las都可以直接实现界面)。然后traceRay接受对接口基类的引用,并在其上调用display方法。