#include <cstdio>
struct A
{
A( )
:
dummy( printf ( "Starting to construct A()\n " ) )
{
printf ( "Fully constructed A()\n " ) ;
}
int dummy;
} ;
template < typename T>
struct Nesting;
template <>
struct Nesting< int >
{
constexpr static int value = 0 ;
} ;
template < template < typename > class T, typename I>
struct Nesting< T< I>>
{
constexpr static int value = 1 + Nesting< I> :: value ;
} ;
template < typename T>
struct B
{
int dummy;
A a;
T b;
B( )
:
dummy( printf ( "Starting to construct B() with nesting %d\n " , Nesting< B< T>> :: value ) ) ,
a( ) ,
b( )
{
printf ( "Fully constructed B() with nesting %d\n " , Nesting< B< T>> :: value ) ;
}
} ;
int main( )
{
B< B< B< int >>> Test;
return 0 ;
}
I2luY2x1ZGUgPGNzdGRpbz4KCnN0cnVjdCBBCnsKICAgIEEoKQogICAgOgogICAgZHVtbXkocHJpbnRmKCJTdGFydGluZyB0byBjb25zdHJ1Y3QgQSgpXG4iKSkKICAgIHsKICAgIAlwcmludGYoIkZ1bGx5IGNvbnN0cnVjdGVkIEEoKVxuIik7CiAgICB9CiAgICBpbnQgZHVtbXk7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IE5lc3Rpbmc7Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgTmVzdGluZzxpbnQ+CnsKCWNvbnN0ZXhwciBzdGF0aWMgaW50IHZhbHVlID0gMDsKfTsKCnRlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFQsIHR5cGVuYW1lIEk+CnN0cnVjdCBOZXN0aW5nPFQ8ST4+CnsKCQljb25zdGV4cHIgc3RhdGljIGludCB2YWx1ZSA9IDEgKyBOZXN0aW5nPEk+Ojp2YWx1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBCCnsKICAgIGludCBkdW1teTsKICAgIEEgYTsKICAgIFQgYjsKICAgIEIoKQogICAgOgogICAgZHVtbXkocHJpbnRmKCJTdGFydGluZyB0byBjb25zdHJ1Y3QgQigpIHdpdGggbmVzdGluZyAlZFxuIiwgTmVzdGluZzxCPFQ+Pjo6dmFsdWUpKSwKICAgIGEoKSwKICAgIGIoKQogICAgewogICAgCXByaW50ZigiRnVsbHkgY29uc3RydWN0ZWQgQigpIHdpdGggbmVzdGluZyAlZFxuIiwgTmVzdGluZzxCPFQ+Pjo6dmFsdWUpOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBCPEI8QjxpbnQ+Pj4gVGVzdDsKICAgIHJldHVybiAwOwp9