Boost logo

Boost :

From: Jonathan Wang (babysloth_at_[hidden])
Date: 2003-01-31 12:54:56


Hi,

There's an nice implementation of the NTP in boost-sandbox, which follows the idea in the book "C++ Templates". But we have to repeat the definitions the "feature_is" classes with virtual inheritance and some typedefs all the time. I wonder if we can make it eaiser.

Taking the test "car" class in the boost-sandbox.ntp as an example, I'd like just to write:
        
    // requires no definitions
    template <typename T> struct Model_is;
    template <typename T> struct Color_is;
    template <typename T> struct Seats_is;
    template <typename T> struct Transmission_is;

then we can easily implement the "car" class like this:

    template <class Model = ntp::nil,
              class Color = ntp::nil,
              class Seats = ntp::nil,
              class Transmission = ntp::nil>
    class car {
      // the default template arguments
      typedef typename boost::mpl::vector4<
          Model_is<gl>, Color_is<red>, Seats_is<leather>, Transmission_is<automatic>
> default_features;

      // all setters
      typedef typename boost::mpl::vector4<Model, Color, Seats, Transmission> setters;

      // update the default arguments
      typedef typename ntp::update<default_features, setters>::type features;

      // the named parameters are accessible through the 'features' type
      typedef typename ntp::extract<features, Model_is>::type model;
      typedef typename ntp::extract<features, Color_is>::type color;
      typedef typename ntp::extract<features, Seats_is>::type seats;
      typedef typename ntp::extract<features, Transmission_is>::type transmission;

      //...
    };

The default features(types) are stored in a type-vector, and we can use boost.mpl to update the default features into use-defined ones, and to extract the updated paramters from type-vector. Then we can use NTPs later. And even can we mix the NTPs and the ordinary paramters, just to use ntp::update2 instead of ntp::update.

The problems I've come across mainly on the lambda support of mpl. I tried to use boost::mpl::fold to implement the "update" template, but failed to compile with bcc 5.6(all is ok with gcc 3.2). And as the template template parameters are used, I wonder if any workaround for VC6. The alternative should be more convenient, but might take more time to compile, and less portable.

I've tried an implementation, and have uploaded it to http://www.c-view.org/ntp.zip. It's beeen tested with Borland C++ Compiler 5.6 and gcc 3.2. The files in the zip package are:

    test.cpp example of NTPs
    test2.cpp example of mixed use of NTPs and ordinary paramters
    ntp.hpp NTP
        ntp2.hpp for mixed use of NTPs and ordinary paramters

Thanks very much for review.

The Chinese Spring Festival is coming. I wish every booster well and happy in the new year. And a Chinese congratulatory saying:

Lucky Money!

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Jonathan Wang
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡babysloth_at_[hidden]
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡2003-02-01


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