繁体   English   中英

C ++ Boost函数回调。 如何调用函数作为回调并在内部传递参数?

[英]C++ Boost function callback. How to invoke function as a callback and pass params inside?

我有班级Manager和班级Scheduler Manager具有Scheduler的实例。 Manager启动Scheduler Scheduler执行某些操作,并且Scheduler必须异步将结果返回给Manager 在下面的示例中,如何使它像下面这样?

class Manager{
private:
    Scheduler *mScheduler;

public:
    Manager(){
        mScheduler = new Scheduler(boost::bind(&Manager::acceptResult, this));
        mScheduler->run();
    }

    void acceptResult(Result::Shared result){
        //do something with result, it's doesn't matter=)
    }
};

typedef boost::function<void()> callback;

class Scheduler {
private:
    callback mManagerCallback;

public:
    Scheduler(callback call){
        mManagerCallback = call;
    }

    void run(){
        //some logic
        mManagerCallback(result);
    }

}

typedef boost::posix_time::ptime Timestamp;
typedef boost::posix_time::time_duration Duration;
typedef uint64_t microseconds_timestamp;

class CommandResult {
public:
    typedef shared_ptr<const CommandResult> SharedConst;

private:
    CommandUUID mCommandUUID;
    uint16_t mResultCode;
    Timestamp mTimestampCompleted;
    string mResultInformation;

public:
    CommandResult(
            const CommandUUID &commandUUID,
            const uint16_t resultCode);

    CommandResult(
            const CommandUUID &commandUUID,
            const uint16_t resultCode,
            string &resultInformation);

    const CommandUUID &commandUUID() const;

    const uint16_t resultCode() const;

    const Timestamp &timestampCompleted() const;

    const string serialize() const;

};

CommandResult与示例中的结果相同。

Scheduler结果时,我需要在他的run()方法中,调用Manager的方法acceptResult()并将结果作为参数传递。 我是C ++的新手,我只是不知道该怎么做。

首先,您必须使它能够使回调可以使用参数:

typedef boost::function<void(CommandResult::SharedConst)> callback;

然后,您需要在绑定中匹配该签名。 看起来您想让结果自由用于Scheduler::run()逻辑中的绑定,因此让我们使用一个占位符:

 mScheduler = new Scheduler(boost::bind(&Manager::acceptResult, this, ::_1));

现在按照您的逻辑,以某种方式产生结果,然后将其传递给回调:

void run(){
    boost::uuids::random_generator rgen;
    CommandResult::SharedConst result(new CommandResult(rgen(), 404u, "Not found"));
    //some logic
    mManagerCallback(result);
}

完整演示: Live On Coliru(C ++ 03)

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/uuid/random_generator.hpp>

typedef boost::posix_time::ptime Timestamp;
typedef boost::posix_time::time_duration Duration;
typedef uint64_t microseconds_timestamp;

typedef boost::uuids::uuid CommandUUID;

class CommandResult {
public:
    typedef boost::shared_ptr<const CommandResult> SharedConst;

private:
    CommandUUID mCommandUUID;
    uint16_t mResultCode;
    Timestamp mTimestampCompleted;
    std::string mResultInformation;

public:
    CommandResult(
            const CommandUUID &commandUUID,
            const uint16_t resultCode,
            std::string const &resultInformation = "")
      : mCommandUUID(commandUUID),
        mResultCode(resultCode),
        mTimestampCompleted(boost::posix_time::second_clock::local_time()),
        mResultInformation(resultInformation)
    { }

    const CommandUUID &commandUUID() const { return mCommandUUID; }
    uint16_t resultCode() const { return mResultCode; }
    const Timestamp &timestampCompleted() const { return mTimestampCompleted; }
};

typedef boost::function<void(CommandResult::SharedConst)> callback;

class Scheduler {
private:
    callback mManagerCallback;

public:
    Scheduler(callback call){
        mManagerCallback = call;
    }

    void run(){
        boost::uuids::random_generator rgen;
        CommandResult::SharedConst result(new CommandResult(rgen(), 404u, "Not found"));
        //some logic
        mManagerCallback(result);
    }
};

#include <iostream>

class Manager{
private:
    Scheduler *mScheduler;

public:
    Manager(){
        //mScheduler = new Scheduler([this](CommandResult::SharedConst result) { acceptResult(result); });
        mScheduler = new Scheduler(boost::bind(&Manager::acceptResult, this, ::_1));
        mScheduler->run();
    }

    void acceptResult(CommandResult::SharedConst result){
        //do something with result, it's doesn't matter=)
        std::cout << "Accepted: " << result->commandUUID() << ", " << result->resultCode() << ": " << result->timestampCompleted() << " \n";
    }
};

int main() {
    Manager m;
}

印刷品:

Accepted: cf946fb0-49f3-425a-8235-558d19bf6f8d, 404: 2016-Dec-23 12:18:01 

奖励:C ++ 11

绑定有点不合时宜(尽管有时候我很喜欢,对于稀有的工作),所以请考虑使用lambda代替:

mScheduler = new Scheduler([this](CommandResult::SharedConst result) { acceptResult(result); });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM