2014-09-03 47 views
2

我試圖將任何泛型函數作爲參數傳遞給C++函數。作爲一個額外的樂趣層,該函數將駐留在它自己的單獨的類中。在這個特殊情況下,他們將全部不參加並返回void。這包括任何通用類的成員。將任何泛型函數作爲C++參數傳遞

我當前的代碼讀取,如:像a forwarding function,或boost::bind

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); 
} 

我見過的解決方案,但據我所知,我不認爲這些解決方案將適合?

還值得注意的是,最終我想通過指針數組傳遞成員函數。例如,如果myPointer[]爲指針,以myClass類對象的數組,那麼這將是很好能夠寫類似:

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

編輯:顯然我是不夠清楚。 This answer不是一個合適的答案,因爲我正在尋找傳遞成員函數和非成員函數作爲參數(而建議的答案是設置一個成員指向同一類的成員函數的成員指針)。

我不認爲前面的函數示例會起作用,因爲轉發函數假定只有一個類類型,我想傳遞一個泛型類的對象。

boost::bind很可能是答案;我只是不熟悉它。任何人都可以指向我的一些新手友好的閱讀材料嗎?

編輯2:對不起,忘了提我是一個裝置,其預C++ 11編程。

+3

_ 「我不認爲這些解決方案將適合?」 _爲什麼? – 2014-09-03 11:03:20

+0

boost :: bind是解決方案,除非您可以將函數myClass :: fn2和myOtherClass :: fn3定義爲靜態。 – pragnesh 2014-09-03 11:06:56

+0

@πάνταῥεῖOriginal post已被編輯,以澄清爲什麼建議的解決方案不是答案。 – Alec 2014-09-03 13:02:08

回答

4

使用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; 
} 
+0

顯示帶有這些成員函數之一的lambda表達式的用法,並且您將從我那裏獲得upvote。 – Puppy 2014-09-03 11:21:16

+0

@Puppy檢查出來 – 2014-09-03 11:29:50

+0

@AntonSavin這看起來像一個美麗的解決方案,但我忘了提及我是pre-C++ 11。 – Alec 2014-09-03 13:00:24

相關問題