/dispatch-cpp

A small C++11 dispatch/signals design that can be used with std::bind, lambdas, static functions, and/or member functions.

Primary LanguageC++OtherNOASSERTION

dispatch++

A small C++11 dispatch/signals design that can be used with std::bind, lambdas, static functions, and/or member functions. It uses C# style += and -= listener syntax.

Example

struct test_signal : public signal {
    int a;
    test_signal(int _a) : signal(), a(_a) { }
};

void dispatch_ts(dispatcher& d, const test_signal& ts) {
    d.dispatch(ts);
}

void do_so(const test_signal& ts) {
    std::cout << "do_so: " << ts.a << std::endl;
}

void test_dispatch() {
    struct dispatch_test {
        void do_something(test_signal a) { 
            std::cout << "dispatch_test.do_something(" << a.a << ")" << std::endl; 
        }
    };

    struct static_func_test {
        static void static_do_something(test_signal& a) { 
            std::cout << "static_func_test.static_do_something(" << a.a << ")" << std::endl; 
        }
    };

    dispatch_test dt;
    test_signal tst(15);

    dispatcher d;
    auto l1 = [](test_signal ts) { 
        std::cout << "value: " << ts.a << std::endl; 
    };
    auto l2 = [](test_signal&& v) { 
        std::cout << "v: " << v.a << std::endl; 
    };
    auto l3 = [](const test_signal& t) { 
        std::cout << "t: " << t.a << std::endl; 
    };
    auto tmp = std::bind(&dispatch_test::do_something, &dt, std::placeholders::_1);
    auto tmp2 = static_func_test::static_do_something;
    auto tmp3 = std::bind(do_so, std::placeholders::_1);

    test_signal ts(323);
    test_signal tsp(23);
    test_signal tone(111);

    d += l1;
    d += l2;
    d += l3;
    d += tmp3;
    d += tmp;

    d.dispatch(ts);
    std::cout << "---\n";

    d -= l2;
    d -= tmp;

    d.dispatch(tsp);
    std::cout << "---\n";

    d -= l3;
    d += tmp2;
    d -= tmp3;

    //d.dispatch(tone);
    dispatch_ts(d, tone);
    std::cout << "---\n";
    
    d -= l1;
    d += tmp;
    d -= tmp2;

    d.dispatch(test_signal{ 5 });
    std::cout << "---\n";
}