# Boost :

From: John Max Skaller (skaller_at_[hidden])
Date: 2001-09-22 12:57:34

Daryle Walker wrote:
>
> I thought of these a while ago. I don't know if I'm ever going to do
> something with these ideas, but maybe one of you can take these.
>
> 1. Some types in Boost items involve a std::pair with both template
> parameters the same type. We could compact this somehow. Too bad we can't
> do:
>
> template < typename T >
> typedef std::pair<T,T> doublet;
>
> I guess we have to make a class template that inherits from std::pair and/or
> uses special conversions.

This is a fundamental construction, its correct name
is 'the diagonal functor', represented by the Greek symbol Delta.
[There is a also a dual 'codiagnoal functor' represented by
an upside-down delta, it eliminates the case of a two alternatives
of the same type]

> 2. If we have [1], we should have a make_doublet function template that
> works like std::make_pair.

You can do it anyhow, just define a new template.
You'd also need two transformations

pair<T,T> <--> diag<T>

> 3. Should we have a pair_switch function template, that takes a
> std::pair<X,Y> and returns a std::pair<Y,X> that is the input in the reverse
> order?

A common name is 'twist'. Again, fundamental.

A generalisation on 'diag' is

diag<n,T> <--> tuple<T,T,T ... T> (n times)

A generalisation on twist is more fun:

permute<permutation, T1, T2, T3, .. >

which reorders the types. Even more general:

extract< [1,3,4,9,6], T1, T2, .. >

which forms

tuple<T1, T3, T4, T9, T6>

This can actually be done I think, using primes and an integer
argument (so that n = 2*^p1 * 3* p2 * 5^p3 .., and one can
find p1, p2, p3 by factorising. This would be fun to do with
templates .. :-]

--
John (Max) Skaller, mailto:skaller_at_[hidden]
10/1 Toxteth Rd Glebe NSW 2037 Australia voice: 61-2-9660-0850
New generation programming language Felix  http://felix.sourceforge.net
Literate Programming tool Interscript
http://Interscript.sourceforge.net