Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2003-01-22 18:26:17


Hugo Duncan <hugoduncan_at_[hidden]> writes:

> I am trying to use MPL to generate code.
>
> I have a list of types, which I would like to use to call a template
> function with arguments that are not dependent on the list.
>
> eg
>
> given:
> template <typename T> void my_function(std::string& s);
> typedef list<int, float, double> my_list;
> std::string s;
>
> what do I write using MPL to generate the equivalent of the following ?
>
> my_function<int>(s);
> my_function<float>(s);
> my_function<double>(s);

With the latest CVS, it would be something like this:

    struct func
    {
        func(std::string& s) : s(s) {}

        template <class T>
        void operator()(T) const
        {
            my_function<T>(s);
        }

     private:
         std::string& s;
    };

    mpl::for_each<my_list>(func(s));

If you have any reference or array types in my_list, you might need to
do this instead:

    struct func
    {
        func(std::string& s) : s(s) {}

        template <class T>
        void operator()(mpl::identity<T>) const
        {
            my_function<T>(s);
        }

     private:
         std::string& s;
    };

    mpl::for_each<my_list, mpl::make_identity<> >(func(s));

HTH,
Dave

-- 
                       David Abrahams
   dave_at_[hidden] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

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