Boost logo

Boost :

Subject: [boost] a (useful?) crtp trick
From: pavel (paul.cpprules_at_[hidden])
Date: 2012-08-24 13:50:45


hi all
i post this in the hope someone finds this technique useful

to make long story short, here is a snippet:

   template<typename t> //tag deducing util
   struct base_tag
   {
     typedef decltype(get_tag((t*)42)) type;
   };
 
   template<typename type,
            typename tag = typename base_tag<type>::type>
   struct Base //crtp base class
   {
     friend tag get_tag(type*); //helper declaration, never defined
   };
 
   template<typename type> //no mention of tag
   void f(const Base<type>&) //tag is deduced automatically
   {}

   struct Foo : Base<Foo, void> //derived type
   {};
 
   int main()
   {
     Foo foo;
     f(foo);
   }

the idea is that if we have an associated type (or types) along with
the "real" type in the crtp pattern we can make that associated type
deduced automatically

and even pretend there is no such tag leaving it e.g. for advanced usage

more on this here:
http://programmizm.sourceforge.net/blog/2012/because-we-can
   

-- 
Pavel
P.S.
if you notice a grammar mistake or weird phrasing in my message
please point it out

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