#include <iostream>
template < int n>
struct bob
{
bob( ) {
std:: cout << "bob" << n << " reporting in\n " ;
} ;
} ;
struct bar {
template < int n>
void Do( ) const {
bob< n> b;
} ;
} ;
template < int n= 0 ,int bit= 9 >
struct foo
{
template < typename F>
void Do( unsigned int x,F&& f) {
if ( ( x>> bit) & 1 ) {
foo< ( n<< 1 ) | 1 ,bit- 1 > ( ) .Do ( x,f) ;
}
else {
foo< ( n<< 1 ) ,bit- 1 > ( ) .Do ( x,f) ;
} ;
} ;
} ;
template < int n>
struct foo< n,- 1 >
{
template < typename F>
void Do( unsigned int x,F&& f) const {
f.template Do< n> ( ) ;
} ;
} ;
template < typename F>
void mojo( int x, F&& f)
{
foo<> ( ) ( x,f) ;
}
int main( )
{
mojo( 7 ,bar( ) ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8aW50IG4+CnN0cnVjdCBib2IKewogICAgYm9iKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiYm9iIiA8PCBuIDw8ICIgcmVwb3J0aW5nIGluXG4iOwogICAgfTsKfTsKCnN0cnVjdCBiYXIgewogICAgdGVtcGxhdGU8aW50IG4+CiAgICB2b2lkIERvKCkgY29uc3QgewogICAgICAgIGJvYjxuPiBiOwogICAgfTsKfTsKCnRlbXBsYXRlPGludCBuPTAsaW50IGJpdD05PgpzdHJ1Y3QgZm9vCnsgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGPgogICAgdm9pZCBEbyh1bnNpZ25lZCBpbnQgeCxGJiYgZikgewogICAgICAgIGlmICgoeD4+Yml0KSYxKSB7CiAgICAgICAgICAgIGZvbzwobjw8MSl8MSxiaXQtMT4oKS5Ebyh4LGYpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9vPChuPDwxKSxiaXQtMT4oKS5Ebyh4LGYpOwogICAgICAgIH07CiAgICB9Owp9OwoKdGVtcGxhdGU8aW50IG4+CnN0cnVjdCBmb288biwtMT4KewogICAgdGVtcGxhdGU8dHlwZW5hbWUgRj4KICAgIHZvaWQgRG8odW5zaWduZWQgaW50IHgsRiYmIGYpIGNvbnN0IHsKICAgICAgICBmLnRlbXBsYXRlIERvPG4+KCk7CiAgICB9Owp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgRj4Kdm9pZCBtb2pvKGludCB4LCBGJiYgZikKewogICAgZm9vPD4oKSh4LGYpOwp9CgppbnQgbWFpbigpCnsKICAgIG1vam8oNyxiYXIoKSk7Cn0K
compilation info
prog.cpp: In function 'void mojo(int, F&&) [with F = bar]':
prog.cpp:49:17: instantiated from here
prog.cpp:44:5: error: no match for call to '(foo<>) (int&, bar&)'
stdout