2015-12-04 22 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

相关问题