0

为了避免代码重复,我试图将指向函数的指针作为静态方法的参数传递。

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

另一个类 (Las) 需要使用 Geo::traceRay(+++) 方法,但应该显示(Las::display(+++)) 其他东西。因此,我尝试将指向函数参数的指针传递给 Geo::traceRay(+++, pointer to function) 方法。指向的函数将正确的“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;
}
4

2 回答 2

0

您不能将成员函数指针作为函数指针传递。我认为制作Las::display静态不是一种选择。在这种情况下,我建议使用 astd::function和 usingstd::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);

无需先取消引用它。

于 2013-05-30T01:29:52.913 回答
0

Chris 的建议是很棒的,如果它是这样的话。

如果您有多个类似的共享函数,另一种方法是使用具有两个实现的接口(带有虚拟方法 Display(+++)),在每个实现中放置一个有问题的实现实例Geo 和 Las (或者 Las 可以直接实现接口)。然后 traceRay 获取接口基类的引用并在其上调用 display 方法。

于 2013-05-30T01:41:14.737 回答