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

将任何泛型函数作为C++;论点 我试图把任何泛型函数作为C++函数中的参数传递。作为一个额外的乐趣层,函数将驻留在它自己的独立类中。在这种特殊情况下,它们都不接受任何参数并返回void。这包括任何泛型类的成员,c++,function,pointers,arguments,member,C++,Function,Pointers,Arguments,Member,我当前的代码如下: class functionsFedHere { public: void (*callback)(); functionsFedHere(void(*)()); } functionsFedHere::functionsFedHere (void(*callbackFunction)()) { callback = callbackFunction; } void fn1() { cout<<"Fn1"<<endl; }

我当前的代码如下:

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

我认为forward函数示例不起作用,因为forward函数采用单一类类型,我希望在其中传递泛型类的对象

boost::bind
很可能就是答案;我只是对它不熟悉。有人能给我指点一些新手读物吗


编辑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;
}
类函数在此设置{
公众:
typedef std::function Func;
Func回调;
functionsFedHere(Func callback){}
};

void fn1(){cout“我认为这些解决方案不合适?”为什么?boost::bind是解决方案,除非您可以将函数myClass::fn2和myOtherClass::fn3定义为静态。@πάνταῥεῖ 原始帖子已被编辑,以澄清为什么建议的解决方案不是答案。@Alec我想说,对于C++11之前的编译器,您也可以同样使用
boost
解决方案。否则,您需要按照这里的答案中的建议来编写自己的东西。
myPointer[0]->fn2
根本不会产生成员函数指针,而且永远不会,句号!这就是副本中详细解释的内容。如果将lambdas与其中一个成员函数一起使用,您将从我那里获得一个向上投票权。@AntonSavin这看起来是一个漂亮的解决方案,但我忘了提到我是C++11之前的版本。@Alec在这种情况下,您可以n将
boost::function
boost::bind
一起使用-本质上是相同的。
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;
}