Figure 3: Function void_compose2

template<class Ufn, class Bfn>
class void_binary_compose : public std::binary_function
        <
        Bfn::first_argument_type, 
        Bfn::second_argument_type, void
        > {
public:
   explicit void_binary_compose(Ufn Fn1, Bfn Fn2)
      : m_Fn1(Fn1), m_Fn2(Fn2) {}
   void operator()
           (
           Bfn::first_argument_type arg1, 
           Bfn::second_argument_type arg2
           )
   { m_Fn1(m_Fn2(arg1, arg2)); }
private:
   Ufn m_Fn1;
   Bfn m_Fn2;
};

template<class Ufn, class Bfn>
void_binary_compose<Ufn, Bfn> void_compose2(Ufn Fn1, Bfn Fn2)
{ return void_binary_compose<Ufn, Bfn>(Fn1, Fn2); }