2015-12-04 44 views
1

我試圖編寫一些代碼來存儲一個函數(帶參數)作爲對象成員,這樣我可以稍後在通用函數中調用它時尚。目前我的例子使用std :: function和std :: bind。存儲在一個對象中包含std ::佔位符的std ::函數

#include <functional> 

class DateTimeFormat { 
    public: 
    DateTimeFormat(std::function<void(int)> fFunc) : m_func(fFunc) {}; 
    private: 
    std::function<void(int)> m_func; 
}; 

class DateTimeParse { 
    public: 
    DateTimeParse() { 
     DateTimeFormat(std::bind(&DateTimeParse::setYear, std::placeholders::_1)); 
    }; 
    void setYear(int year) {m_year = year;}; 
    private: 
    int m_year; 
}; 

int main() { 
    DateTimeParse dtp; 
} 

由此我得到的錯誤

stackoverflow_datetimehandler.cpp: In constructor ‘DateTimeParse::DateTimeParse()’: stackoverflow_datetimehandler.cpp:16:95: error: no matching function for call to ‘DateTimeFormat::DateTimeFormat(char, int, int, int, std::_Bind_helper&>::type)’ DateTimeFormat('Y',4,1900,3000,std::bind(&DateTimeParse::setYear, std::placeholders::_1));

我不認爲那是因爲我的構造函數不申報正確的參數類型。但我不確定我是否正朝着正在努力實現的目標前進。有沒有更好的方法來完成這項任務?如果這是處理這個問題的好方法,那麼我該如何去解決這個問題並保留佔位符?

+1

你的意思'的std ::綁定(DateTimeParse :: setYear,這種/ * * <<< /,的std ::佔位符:: _ 1)'? –

+0

'DateTimeFormat'只有一個參數,一些可轉換爲'std :: function '。那麼究竟是什麼 - 「'Y',4,1900,3000'? – Praetorian

回答

3

非靜態成員函數必須是綁定到一個對象,所以你將不得不改變:

DateTimeFormat(std::bind(&DateTimeParse::setYear, this, std::placeholders::_1)); 

也就是說你必須綁定this爲好。

Live Demo

+0

但是保證這個指針保持有效嗎?我的意思是,std ::函數被初始化爲來自std :: bind()的臨時指針。 – sebkraemer

相關問題