Dr. Dobb's is part of the Informa Tech Division of Informa PLC

This site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726.


Channels ▼
RSS

Using Chains to Free Library Code


July, 2005: Using Chains to Free Library Code

Listing 2

#include <boost/tuple/tuple.hpp>

// Template to append a type to a cons, thus creating a new cons.
template< class CONS, class TYPE >
struct AppendCons
{
    typedef boost::tuples::cons<
        typename CONS::head_type, typename AppendCons<
            typename CONS::tail_type, TYPE >::type > type;
};
// Partially specialize for the end of the list.
template< class TYPE >
struct AppendCons< boost::tuples::null_type, TYPE >
{
    typedef boost::tuples::cons<
        TYPE, boost::tuples::null_type > type;
};
// A type that collects values. Like Boost tuple, this type is a cons. 
// However, unlike Boost tuple, it is left-associative. That's 
// because the dot operator is left-associative.
template< class HEAD, class TAIL >
struct GenTuple
{
    // The GenTuple defining the first part of the set.
    HEAD head;
    // Use of TAIL reference makes it possible for the compiler to optimize. 
    // However, it also means that the object lifetime must be shorter than
    // the values it manages. Fortunately, this class
    // is only intended to be used as a temporary.
    const TAIL &tail;
    
    // Generate the type of Boost cons, which is the workhorse behind tuple.
    typedef typename AppendCons<
        typename HEAD::cons, TAIL >::type cons;

    // Count the items in the tuple.
    enum { DEPTH = HEAD::DEPTH+1 };
    
    GenTuple( const HEAD &h, const TAIL &t ) :
        head( h ),
        tail( t ) {}

    // Return new object that also implements add, which lets you chain calls.
    template< class NEXT >
    GenTuple< GenTuple< HEAD, TAIL >, NEXT >
        add( const NEXT &next ) const
    {
        return GenTuple< GenTuple< HEAD, TAIL >, NEXT >
            ( *this, next );
    }
    // Construct, initialize, and return a Boost tuple.
    cons tuple() const
    {
        cons value;
        prepareTuple( value );
        return value;
    }
    // Recursively fill in the tuple.
    template< class TUPLE >
    void prepareTuple( TUPLE &t ) const
    {
        head.prepareTuple( t );
        ::boost::tuples::get<DEPTH>(t) = tail;
    }
    // Discourage declaration of non-temporaries.
    GenTuple();
};
// Start with a type that generates an empty tuple.
struct GenTupleStart
{
    enum { DEPTH = -1 };
    typedef boost::tuples::null_type cons;
    
    template< class TUPLE >
    void prepareTuple( TUPLE &t ) const
    {
    }
};
// Start the process with a function.
template< class FIRST >
GenTuple< GenTupleStart, FIRST >
    genTuple( const FIRST &first )
{
    return GenTuple< GenTupleStart, FIRST >
        ( GenTupleStart(), first );
}


Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.