読者です 読者をやめる 読者になる 読者になる

メンバ関数を扱いやすくするbind

C++

Boost.Asioを使ってるとよく出てくる

async_xxx(boost::bind(&Client::on_xxx, this, _1));

というメンバ関数のbind。さすがに非同期通信でいっぱい書いてるとめんどくさいです。
可変長マクロで短くしてみました。

#include <boost/bind.hpp>
#define xbind(F, ...) boost::bind(&this_type::F, this, __VA_ARGS__)

そのクラスに、自分自身の型を示すthis_typeをtypedefしておけば使えます。
VC++9.0で動作確認。

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>

#define xbind(F, ...) boost::bind(&this_type::F, this, __VA_ARGS__)

namespace asio = boost::asio;

class Client {
    asio::io_service& io_service_;
    asio::deadline_timer timer_;

    typedef Client this_type;

public:
    Client(asio::io_service& io_service)
        : io_service_(io_service),
          timer_(io_service)
    {}

    void start()
    {
        timer_.expires_from_now(boost::posix_time::seconds(3));
        timer_.async_wait(xbind(on_timer, _1));
    }

private:
    void on_timer(const boost::system::error_code)
    {
        std::cout << "(^o^)" << std::endl;
    }
};

int main()
{
    asio::io_service io_service;

    Client client(io_service);
    client.start();

    io_service.run();
}