目前,我在定时器和堆栈的帮助下延迟了函数调用。 这样的事情:
enum fnc_t {
_FNC_1,
_FNC_2,
__MAX_FNC
};
typedef std::deque<fnc_t> calls_t;
calls_t _calls;
void fnc1() {
_calls.push_back( _FNC_1 );
}
void fnc2() {
_calls.push_back( _FNC_2 );
}
void onTimer() {
while ( _calls.front() ) {
if ( _calls.front() == _FNC_1 ) {
doFnc1();
} else if ( _calls.front() == _FNC_2 ) {
doFnc2();
}
_calls.pop_front();
}
}
不,我需要为我的函数fnc1和fnc2添加参数,即
void fnc1( std::string a1 ){}
void fnc2( int a21, void * a22 ) {}
并在我的延迟通话中使用它们,即
...
doFnc1( a11 );
...
doFnc( a21, a22 );
实现这一目标的最佳方法是什么?我可以用一些struct而不是fnc_t来实现这个任务,它将包含一些额外的空间用于常见的参数,例如:
struct fnc_call_t {
fnc_t fnc;
void * p[5];
}
在我看来,这种方式并不那么方便。还有其他解决方案吗?
答案 0 :(得分:1)
不幸的是我不能使用boost或C ++ 11所以我已经按照以下方式完成了它
class Call {
public:
virtual void run() = 0;
public:
virtual ~Call(){
}
};
class CallFnc1: public Call {
public:
void run() {
doFnc1(a,q);
}
public:
CallFnc1( int a, std::string q ) : _a(a),_q(q){
}
~CallFnc1(){
}
private:
int _a;
std::string _q;
};
typedef std::deque<Call*> calls_t;
calls_t _calls;
int fnc1( int a, std::string q) {
_calls.push_back( new CallFnc1(a,q) );
}
void onTimer() {
while ( _calls.front() ) {
Call * q = _calls.front();
q->run();
delete q;
_calls.pop_front();
}
}