Listing 2: Using a tag for selecting and instantiating a new policy

// policy templates //////////////////////////////////////////////////

template < class T >
struct SingleThread
{
  // implementation
};

template < class T >
struct ClassLocking
{
  // implementation
};


// tag harness for the policy classes ////////////////////////////////

struct ThreadingPolicyTag {};
template < class Tag, class T > struct ThreadingPolicy;

struct SingleThreadTag : ThreadingPolicyTag {};
template < class T >
struct ThreadingPolicy< SingleThreadTag, T > : SingleThread< T > {};

struct ClassLockingTag : ThreadingPolicyTag {};
template < class T >
struct ThreadingPolicy< ClassLockingTag, T > : ClassLocking< T > {};


// policy selection tool: ////////////////////////////////////////////

template < class TagList, 
           class TagRoot,
           class DefaultTag
         >
struct SelectPolicyTag
{
  typedef DefaultTag Result;
};

template < class Head, 
           class Tail, 
           class TagRoot, 
           class DefaultTag 
         >
struct SelectPolicyTag< Typelist< Head, Tail >,
                        TagRoot,
                        DefaultTag
                      >
{
  typedef Select < SUPERSUBCLASS( TagRoot, Head ),
                   Head,
                   SelectPolicyTag< Tail,
                                    TagRoot,
                                    DefaultTag
                                  >::Result
                 >::Result
           Result;
};


// finally, FixedSizeArray implementation ////////////////////////////

template < class T, class PolicyTagList = NullType >
class FixedSizeArray {
  typedef ThreadingPolicy < SelectPolicyTag < PolicyTagList,
                                              ThreadingPolicyTag,
                                              SingleThreadTag
                                            >::Result,
                    T 
                          > MyThreadingPolicy;
};
— End of Listing —