Boost.Signals2 で false を返すと disconnect する

と、いうのを書きたかっただけ。

[ソース]

#include <boost/signals2.hpp>
#include <iostream>

template<typename F, typename ...Args>
boost::signals2::connection
connect(boost::signals2::signal<void(Args...)>& sig, F func){
    auto connecter = [=](boost::signals2::connection const& connection, Args... args){
        if( !func(args...) ){
            connection.disconnect();
        }
    };
    return sig.connect_extended(connecter);
}


int
main(){
    boost::signals2::signal<void(int)> sig;
    ::connect(sig, [](int n)->bool{
        std::cout << n << std::endl;
        return true;
    });
    ::connect(sig, [](int n)->bool{
        std::cout << n + n << std::endl;
        return n % 2 != 0;
    });
    ::connect(sig, [](int n)->bool{
        std::cout << n * n << std::endl;
        return n % 3 != 0;
    });
    sig(9);
    sig(8);
    sig(7);

    return 0;
}

[出力]

9
18
81
8
16
7


connect_extended で接続すると 第一引数に boost::signals2::connection が渡されるのでそれを利用すればよいみたい。
書いてから思ったけどこれぐらいならヘルパ関数用意しなくても直接ラムダを書いてしまってもよさそう。