将任何泛型函数作为C++参数传递

Passing any generic function as a C++ argument

本文关键字:C++ 参数传递 函数 任何 泛型      更新时间:2023-10-16

我正试图将任何泛型函数作为C++函数中的参数传递。作为额外的一层乐趣,函数将驻留在它自己的独立类中。在这种特殊情况下,它们都不接受任何参数,并返回void。这包括任何泛型类的成员。

我当前的代码如下:

class functionsFedHere {
public:
    void (*callback)();
    functionsFedHere(void(*)());
}
functionsFedHere::functionsFedHere (void(*callbackFunction)()) {
    callback = callbackFunction;
}
void fn1() { cout<<"Fn1"<<endl; }
class myClass {
public:
    int i;
    void fn2() { cout<<i<<endl; }
}
class myOtherClass {
public:
    string j;
    void fn3() { cout<<j<<endl; }
}
int main() {
    // Initialise some objects
    myClass b;
    b.i = 2;
    myOtherClass c;
    c.j = "some text";
    // Works fine with non-member functions
    functionsFedHere objectA(fn1);
    objectA.callback();
    // Doesn't work with member functions
    functionsFedHere objectB(b.fn2);
    functionsFedHere objectC(c.fn3);
}

我见过转发功能或boost::bind之类的解决方案,但据我所知,我认为这些解决方案不适合?

同样值得注意的是,最终我希望通过指针数组的方式传递成员函数。例如,如果myPointer[]是指向myClass类对象的指针数组,那么能够编写以下内容将是一件好事:

functionsFedHere objectD(myPointer[0]->fn2);

编辑:显然我不够清楚。这个答案不是一个合适的答案,因为我希望将成员函数和非成员函数都作为参数传递(而建议的答案是设置一个指向同一类成员函数的成员指针)。

我不认为forward函数的例子会起作用,因为forward函数假设一个类类型,我想在其中传递一个泛型类的对象。

CCD_ 4很可能是答案;我只是不熟悉。有人能给我指一些对新手友好的读物吗?

编辑2:对不起,忘了提一下我正在C++11之前的设备上编程。

使用std::function:

class functionsFedHere {
public:
    typedef std::function<void()> Func;
    Func callback;
    functionsFedHere(Func callback_) : callback(callback_) {}
};
void fn1() { cout<<"Fn1"<<endl; }
class myClass {
public:
    int i;
    void fn2() { cout<<i<<endl; }
};
class myOtherClass {
public:
    string j;
    void fn3() { cout<<j<<endl; }
};
class callableClass {
public:
    void operator()() { std::cout << "in callableClass" << std::endl; }
};
int main() {
    // Initialise some objects
    myClass b;
    b.i = 2;
    myOtherClass c;
    c.j = "some text";
    // Works fine with non-member functions
    functionsFedHere objectA(fn1);
    objectA.callback();
    // Works with member functions now
    functionsFedHere objectB(std::bind(&myClass::fn2, b));
    objectB.callback();
    functionsFedHere objectC(std::bind(&myOtherClass::fn3, c));
    objectC.callback();
    // Works with lambdas as well
    functionsFedHere objectLambda([]() { std::cout << "in lambda" << std::endl; });
    objectLambda.callback();
    // Works also with classes with overloaded operator()
    functionsFedHere(callableClass()).callback();
    return 0;
}