Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2006-10-02 06:40:08


Jeremy Siek <jeremy.siek_at_[hidden]> writes:

> With scoped maps, you can have different concept maps in scope
> in different parts of your code.
>
> So if you're about to call an algorithm, and you want pair<int*,int*>
> to be treated a something with just 2 elements, you would import
> the concept map from fusion.
>
> Later on, in a different scope, if you want pair<int*,int*> to be
> treated as something with second-first elements, then you'd
> import the concept map from the range library.

Sure. So, leaving aside that I have the syntax and probably a few
other things wrong:

    template <class T, Sequence<int*> S1, Sequence<T> S2, UnaryFunction<T,int*> F>
    void transform(S1 const& src, S2& dst, F f)
    {
        ...
    }

    struct address
    {
        template <class T>
        T* operator()(T& x)
        {
            return &x;
        }
    };

    typedef std::pair<int*,int*> r;

    template <Sequence<int> S1>
    std::pair<int*,int*> f(S1 s)
    {
        r ret;

        // treat pair<int*,int*> as a sequence of int*
        concept_map<r, Sequence<int*> >
        {
            ...
        };

        transform(s, ret, address());
    }

    int storage[2];
    r input = { storage, storage+2 };

    // Treat pair<int*,int*> as a sequence of int
    concept_map<r, Sequence<int> >
    {
        ...
    };

    // OK?
    r x = f(input);

    // which concept does x model?

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk