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
        [EMAIL PROTECTED]
          2003-02-01


_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to