C++可調(diào)用對(duì)象包裝器和可變參數(shù)模板結(jié)合實(shí)現(xiàn)任意函數(shù)調(diào)用

#include <iostream>
#include <functional>
using namespace std;

void MyFunc(int i, char j) {
    cout << "MyFunc function called, a int arg:" << i << " ,a char arg:" << j << endl;
}

template<class F, class... Args>
void callback(F func, Args... args) {
    cout << "callback function called" << endl;
    
    function<void()> arr[5];
    // function<void()>類型包裝了返回值為void、參數(shù)列表為空的函數(shù)
    arr[0] = bind(func, args...);
    // bind()把函數(shù)和參數(shù)綁定起來,形成一個(gè)仿函數(shù):返回值為void、參數(shù)列表為空void     void Object.operator() ();
    // 如果是成員函數(shù),還能把成員函數(shù)對(duì)象和成員函數(shù)綁定起來,再和參數(shù)綁定起來
    // 這樣剛好就能被function<void()>包裝存儲(chǔ)起來
    arr[0]();
    return;
}

class MyClass {
public:
    void m_func(int i) {
        cout << "MyClass::m_func function called, a int arg:" << i << endl;
    }
};

int main() {
    callback(MyFunc, 555, 'v');
    MyClass mc;
    callback(&MyClass::m_func,&mc,100);
    callback([](int i){cout << "lambda function called, a int arg:" << i << endl; }, 666);
    return 0;
}
```cpp
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容