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

标签 c++ function pointers arguments member

我试图将任何泛型函数作为 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);
}

我见过类似 a forwarding function 的解决方案,或boost::bind ,但据我所知,我认为这些解决方案不合适?

还值得注意的是,最终我想通过指针数组传递成员函数。例如,如果 myPointer[]是指向 myClass 类对象的指针数组,那么如果能够编写如下内容就太好了:

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

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

我认为转发函数示例不起作用,因为转发函数假定单个类类型,我想在其中传递泛型类的对象。

boost::bind很可能就是答案;我只是对它不熟悉。谁能给我一些适合新手的阅读 Material ?

编辑 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;
}

关于c++ - 将任何泛型函数作为 C++ 参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25642639/

相关文章:

C++ store functor 在类中

c++ - 将 Microsoft COM IDL 编译/翻译为地道的 C++?

c++ - 对值进行排序

swift - 使用嵌套函数作为 `UIButton` 的操作

c - 使用指针迭代字符串

c - 为什么结构分配适用于结构中的数组

c++ - SSE:将__m128和__m128i转换为两个__m128d

function - 我需要将一些 Delphi 7 代码转换为 Seattle,但我无法使用预定义函数结果 "Result"

php - 检查IP地址是否在网络中

c++ - 输入结构体中数组的大小