【问题标题】:Delayed function call, how to pass params?延迟函数调用,如何传递参数?
【发布时间】:2014-06-28 11:25:38
【问题描述】:

目前,我在计时器和堆栈的帮助下进行延迟函数调用。 类似的东西:

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 );

实现这一目标的最佳方法是什么?我可以用一些结构而不是 fnc_t 来实现这个任务,它将为公共参数包含一些额外的空间,例如:

struct fnc_call_t {
  fnc_t fnc;
  void * p[5];
}

在我看来,这种方式不太方便。还有其他解决方案吗?

【问题讨论】:

标签: c++ function arguments call delay


【解决方案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();
    }
}

【讨论】:

    猜你喜欢
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2017-09-06
    相关资源
    最近更新 更多