|
Boost : |
Subject: Re: [boost] a (useful?) crtp trick
From: Mathias Gaunard (mathias.gaunard_at_[hidden])
Date: 2012-08-25 11:31:53
On 24/08/2012 19:50, pavel wrote:
> 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);
> }
What's the advantage over
template<class T>
struct tag_of;
template<class Derived>
struct Base
{
typedef typename tag_of<Derived>::type tag;
};
struct Foo : Base<Foo>
{
};
template<>
struct tag_of<Foo>
{
typedef void type;
};
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk