自己翻译的 肯定会有错误\问题哈
Timer.4 - Using a member function as a handler
https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/tutorial/tuttimer4.html
Timer.4 - Using a member function as a handler
本例我们将会看到如何将一个类的成员函数作为回调执行函数.这次的程序应该跟上一篇教程 Timer.3中的程序执行结果一样.
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>
区别于我们之前把一个自由函数print作为回调处理函数的做法,这次我们定义了一个叫做printer的类.
class printer
{
public:
这个类的构造函数传一个io_context的引用进来, 类成员timer_初始化的时候用.之前用来控制停止的计数器count现在也作为类的成员变量了.
printer(boost::asio::io_context& io)
: timer_(io, boost::asio::chrono::seconds(1),
count_(0)
{
boost::bind()函数用在类的成员函数上也可以像自由函数一样正常工作.不过所有的类的非静态成员函数都有一个隐含的 this 形参,所以我们要把这个this用bind绑到成员函数上.跟上篇教程Timer.3里说的一样,boost::bind() 把我们的回调函数转换为一个可以被async_wait接受的函数.
你可能会注意到,boost::asio::placeholders:error 的占位符在这里没有,因为成员print根本嫩就没有这个形参.
timer_.async_wait(boost::bind(&printer::print, this));
}
在下面的构造函数中,我们会把计数器的最终值给打印出来.
~printer()
{
std::cout << "Final count is " << count_ << std::endl;
}
至于这个print成员函数就跟我们上一篇写的print函数差不多了,只不过改参数里的数据现在换成改类的成员变量了.
void print()
{
if (count_ < 5)
{
std::cout << count_ << std::endl;
++count_;
timer_.expires_at(timer_.expiry() + boost::asio::chrono::seconds(1));
timer_.async_wait(boost::bind(&printer::print, this));
}
}
private:
boost::asio::steady_timer timer_;
int count_;
};
main函数比之前简单多了,现在只要在io_context之前定义一个printer对象就行了.
int main()
{
boost::asio::io_context io;
printer p(io);
io.run();
return 0;
}
再把代码整体再回顾一遍
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>
class printer
{
public:
printer(boost::asio::io_context& io)
: timer_(io, boost::asio::chrono::seconds(1)),
count_(0)
{
timer_.async_wait(boost::bind(&printer::print, this));
}
~printer()
{
std::cout << "Final count is " << count_ << std::endl;
}
void print()
{
if (count_ < 5)
{
std::cout << count_ << std::endl;
++count_;
timer_.expires_at(timer_.expiry() + boost::asio::chrono::seconds(1));
timer_.async_wait(boost::bind(&printer::print, this));
}
}
private:
boost::asio::steady_timer timer_;
int count_;
};
int main()
{
boost::asio::io_context io;
printer p(io);
io.run();
return 0;
}
自己再试图改成只使用boost::asio
#include <boost/asio.hpp>
#include <iostream>
#include <functional>
#include <chrono>
//#include <system_error>
using namespace std::chrono_literals;
namespace asio = boost::asio;
class printer
{
public:
printer(boost::asio::io_context& io)
: timer_(io, 1s),
count_(0)
{
timer_.async_(std::bind(&printer::print, this));
}
~printer()
{
std::cout << "Final count is " << count_ << std::endl;
}
void print()
{
if (count_ < 5)
{
std::cout << count_ << std::endl;
++count_;
timer_.expires_at(timer_.expiry() + 1s);
timer_.async_wait(std::bind(&printer::print, this));
}
}
private:
boost::asio::steady_timer timer_;
int count_;
}
int main()
{
boost::asio::io_context io;
printer p(io);
io.run();
return 0;
}
Timer.4 - Using a member function as a handler
https://www.boost.org/doc/libs/1_74_0/doc/html/boost_asio/tutorial/tuttimer4.html