2015-01-04 34 views
0

我想傳遞一個無參數的void函數或一個帶參數的void函數作爲參數。就像這樣:在C++中使用或不使用參數傳遞函數

DailyActivity activity1(&function1) 

DailyActivity activity2(&function2(uint_t 1)) 

過去了DailyActivity::run()被稱爲應觸發功能。

DailyActivity標題是這樣的:

class DailyActivity { 
    typedef void (*function_type)(); 

    public: 
    DailyActivity(void (*f)()); 
    virtual void run(); 

    private: 
    function_type m_function; 
}; 

構造函數和run()函數如下:

DailyActivity::DailyActivity(void (*f)()) : m_function((*f)) { 
} 

DailyActivity::run() { 
    m_function(); 
} 

但我不管理(1)定義中的typedef一個正確的方法使兩個不同的函數被接受,並且(2)成功地傳遞函數2的參數。

+0

你說的是兩個完全不同的功能類型。一個'typedef'將不能兼容它們。你將不得不使用可變參數或模板來完成你所要求的。 –

回答

0

您可以使用std::functionlambdastd::bind

class DailyActivity { 
    public: 
    explicit DailyActivity(std::function<void()> f) : m_function(f) {} 
    void run() { m_function(); } 

    private: 
    std::function<void()> m_function; 
}; 

,並調用它

DailyActivity activity1(&function1); 
DailyActivity activity2([](){function2(1);}); 

Live example

+0

謝謝!這正是我想要做的。不幸的是,我使用的環境不支持std:函數,因爲我已經理解了它:( – sehlstrom

+1

)如果你不能使用C++ 11,也許可以使用[Boost.Function](http:// www。 boost.org/doc/libs/1_57_0/doc/html/function.html)呢? – Jarod42

2

你不能那樣做。不幸的是C++不能處理部分函數,​​所以你必須重載你的構造函數,把函數和參數作爲兩個獨立的參數,第二個參數來處理無參數的參數。然後你將有兩個函數指針,其中一個應該爲null。

另一種選擇是將函數包裝到lambda中。

相關問題