How to write a binder3 tempalte function?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Hill

    How to write a binder3 tempalte function?

    This is an exercise on TCPL:
    Write a b i n d e r 3 () that binds the second and third arguments of
    a threeargument function to produce a unary predicate. Give an example
    where b i n d e r 3 () is a useful function.
    And i got a solution from << C++ solutions>>:


    template<typena me FO>
    struct binder2_3
    {
    typedef typename FO::result_type result_type;
    typedef typename FO::first_argum ent first_argument;
    binder2_3(const FO& fo,
    typename FO::second_argu ment& a2,
    typename FO::third_argum ent& a3)
    :fo_(fo), a2_(a2), a3_(a3){}
    result_type operator()(firs t_argument a1){
    return fo_(a1, a2_, a3_);
    }
    private:
    FO fo_;
    const typename FO::second_argu ment a2_;
    const typename FO::third_argum ent a3_;
    };
    template<typena me FO, typename P2, typename P3inline
    binder2_3<FObin der3(const FO& fo, const P2& a2, const P3& a3){
    return binder2_3<FO>(f o, a2, a3);
    }

    I can't understand the followingn sentence:
    typedef typename FO::result_type result_type;
    It require FO has a member named result_type ? This is a too restrict
    rule.
    Could someone give an explaination?
    Thanks
  • Maxim Yegorushkin

    #2
    Re: How to write a binder3 tempalte function?

    On Oct 31, 2:39 am, Hill <zhubi...@gmail .comwrote:
    This is an exercise on TCPL:
    Write a b i n d e r 3 () that binds the second and third arguments of
    a threeargument function to produce a unary predicate. Give an example
    where b i n d e r 3 () is a useful function.
    And i got a solution from << C++ solutions>>:
    >
    template<typena me FO>
    struct binder2_3
    {
        typedef typename FO::result_type result_type;
        typedef typename FO::first_argum ent first_argument;
        binder2_3(const FO& fo,
                  typename FO::second_argu ment& a2,
                  typename FO::third_argum ent& a3)
            :fo_(fo), a2_(a2), a3_(a3){}
        result_type operator()(firs t_argument a1){
            return fo_(a1, a2_, a3_);
        }
    private:
        FO fo_;
        const typename FO::second_argu ment a2_;
        const typename FO::third_argum ent a3_;};
    >
    template<typena me FO, typename P2, typename P3inline
    binder2_3<FObin der3(const FO& fo, const P2& a2, const P3& a3){
        return binder2_3<FO>(f o, a2, a3);
    >
    }
    >
    I can't understand the followingn sentence:
    typedef typename FO::result_type result_type;
    It require FO has a member named result_type ?
    It requires FO to have a type member named result_type: typedef,
    struct, class or union.
    This is a too restrict rule.
    Could someone give an explaination?
    This is because your binder object wraps the call to the underlying
    functor. The binder has to return the result of the functor call,
    therefore to be able to declare the type of the return value of
    binder::operato r() it needs to know the type of the return value of
    the underlying functor.

    --
    Max

    Comment

    Working...