#include<iostream>
using namespace std;
template<class T> struct Help
{
static size_t doSomething()
{
cout<<"calling Work with param U"; return sizeof(T);
}
};
template<> struct Help<float>
{
static size_t doSomething()
{
cout<<"calling Work with param float"; return sizeof(float);
}
};
template <class T, template <class> class V> struct CAttrib : Help<T>{};
template<class T> struct Test {};
int main()
{
cout<< CAttrib<int, Test>::doSomething()<<endl;
cout<< CAttrib<float, Test>::doSomething()<<endl;
}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgSGVscAp7CiAgICBzdGF0aWMgc2l6ZV90IGRvU29tZXRoaW5nKCkKICAgIHsKICAgICAgICBjb3V0PDwiY2FsbGluZyBXb3JrIHdpdGggcGFyYW0gVSI7ICByZXR1cm4gc2l6ZW9mKFQpOwogICAgfQp9Owp0ZW1wbGF0ZTw+IHN0cnVjdCBIZWxwPGZsb2F0Pgp7CiAgICBzdGF0aWMgc2l6ZV90IGRvU29tZXRoaW5nKCkKICAgIHsKICAgICAgICBjb3V0PDwiY2FsbGluZyBXb3JrIHdpdGggcGFyYW0gZmxvYXQiOyAgcmV0dXJuIHNpemVvZihmbG9hdCk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBWPiBzdHJ1Y3QgQ0F0dHJpYiA6IEhlbHA8VD57fTsKCgp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgVGVzdCB7fTsKCmludCBtYWluKCkKewogICAgY291dDw8IENBdHRyaWI8aW50LCBUZXN0Pjo6ZG9Tb21ldGhpbmcoKTw8ZW5kbDsKICAgIGNvdXQ8PCBDQXR0cmliPGZsb2F0LCBUZXN0Pjo6ZG9Tb21ldGhpbmcoKTw8ZW5kbDsKfQ==