#include <iostream>
using namespace std;
template <class Hrm, class A>
void foo(Hrm& h, A& a)
{
cout << "generic" << endl;
}
template <template <bool> class Hrg>
void foo(Hrg<false>& h, int& a)
{
cout << "specialized int" << endl;
}
template <template <bool> class Hrg>
void foo(Hrg<true>& h, const int& a)
{
cout << "specialized const-int" << endl;
}
template <bool W>
struct what;
template<> struct what<true> { };
template<> struct what<false> { };
int main() {
what<true> wt;
what<false> wf;
int i = 5;
const int& ri = i;
foo(wt, i);
foo(wf, i);
foo(wt, ri);
foo(wf, ri);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGNsYXNzIEhybSwgY2xhc3MgQT4Kdm9pZCBmb28oSHJtJiBoLCBBJiBhKQp7Cgljb3V0IDw8ICJnZW5lcmljIiA8PCBlbmRsOwp9Cgp0ZW1wbGF0ZSA8dGVtcGxhdGUgPGJvb2w+IGNsYXNzIEhyZz4Kdm9pZCBmb28oSHJnPGZhbHNlPiYgaCwgaW50JiBhKQp7Cgljb3V0IDw8ICJzcGVjaWFsaXplZCBpbnQiIDw8IGVuZGw7Cn0KCnRlbXBsYXRlIDx0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgSHJnPgp2b2lkIGZvbyhIcmc8dHJ1ZT4mIGgsIGNvbnN0IGludCYgYSkKewoJY291dCA8PCAic3BlY2lhbGl6ZWQgY29uc3QtaW50IiA8PCBlbmRsOwp9Cgp0ZW1wbGF0ZSA8Ym9vbCBXPgpzdHJ1Y3Qgd2hhdDsKCnRlbXBsYXRlPD4gc3RydWN0IHdoYXQ8dHJ1ZT4geyB9Owp0ZW1wbGF0ZTw+IHN0cnVjdCB3aGF0PGZhbHNlPiB7IH07CgoKaW50IG1haW4oKSB7Cgl3aGF0PHRydWU+IHd0OwoJd2hhdDxmYWxzZT4gd2Y7IAoJCglpbnQgaSA9IDU7Cgljb25zdCBpbnQmIHJpID0gaTsKCQoJZm9vKHd0LCBpKTsKCWZvbyh3ZiwgaSk7Cglmb28od3QsIHJpKTsKCWZvbyh3ZiwgcmkpOwoJcmV0dXJuIDA7Cn0=