C++ 我的代码与Boost.Asio教程中给出的代码等效吗?

C++ 我的代码与Boost.Asio教程中给出的代码等效吗?,c++,boost,c++11,lambda,boost-asio,C++,Boost,C++11,Lambda,Boost Asio,我正在学习Boost.Asio,这就是我要说的代码: 我编写的以下代码似乎是相同的,并且可以正常工作: (使用“-lboost_system”和“-std=c++11”编译) #包括 #包括 #包括 #包括 typedef const boost::system::error_code cbse; int main() { boost::asio::io_服务io; boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));

我正在学习Boost.Asio,这就是我要说的代码:

我编写的以下代码似乎是相同的,并且可以正常工作: (使用“-lboost_system”和“-std=c++11”编译)

#包括
#包括
#包括
#包括
typedef const boost::system::error_code cbse;
int main()
{
boost::asio::io_服务io;
boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));
整数计数=0;
std::函数
cb=[&](cbse&)
{

如果(count您的代码似乎正常

您所做的不是递归调用,因为
deadlock\u timer::async\u wait
只是发布一个事件并立即返回。回调实际上是从
ioservice::run
中的循环调用的

我是否遗漏了一些重要的区别

您的代码看起来正常,并且与链接到的示例代码具有大致相同的行为。唯一真正的区别是您正在从封闭范围访问
t
count
,而不是使用参数。在这样一个简单的示例中,这是正常的,但可能会为更复杂的代码带来问题

同样递归调用回调对我来说也不是一个好主意,在文档中给出它只是为了解释吗

从回调中再次调用
async\u wait
对于获得所需的行为至关重要。否则回调将只调用一次


像这样链接异步回调在小心完成时非常有用,但如果不这样做,很快就会导致代码难以理解/调试。

如果使用c++11,使用类型推断是值得的:
auto cb=..
@IgorR.:不会编译,因为对象是在类型推断之前使用的。对,错过了这一点…auto wo不编译,因为对象cb是在类型推导之前使用的。@manasij7479,你试过了吗?我找不到“对象cb是在类型推导之前使用的”?真的,我错过了这个“内部”行。谢谢。谢谢,你能想出一个比这种链接模式更不“麻烦”的替代方案吗?@manasij7479:这完全取决于你想做什么。如果你想在给定的时间间隔内多次调用函数(这就是示例所示),并希望使用异步调用来实现这一点,那么给出的方法是合适的。唯一真正的替代方法是在一个循环中以睡眠左右的方式同步完成所有事情。@manasij7479:围绕异步模型需要一段时间。这不是最终解决方案,但在某些情况下它会发光。诀窍在于了解w什么时候使用它,什么时候避免它(就像每个工具一样)。@manasij7479替代方法是使用联合例程:
#include<iostream>
#include<boost/asio.hpp>
#include<functional>
#include<boost/date_time/posix_time/posix_time.hpp>

typedef const boost::system::error_code cbse;
int main()
{
    boost::asio::io_service io;

    boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));

    int count=0;

    std::function<void(cbse&)> 
    cb=[&](cbse&)
    {
        if(count<5)
        {
            std::cout<<"foo"<<std::endl;
            count++;
            t.expires_at(t.expires_at()+boost::posix_time::seconds(1));
            t.async_wait(cb);
        }
        else
            std::cout<<"done"<<std::endl;
    };

    t.async_wait(cb);

    std::cout<<"Hello"<<std::endl;

    io.run();

    return 0;
}