#include <iostream>
using namespace std;
template<class T>
struct Foo{
Foo(T* t):_t(t){}
T * _t;
};
struct Bar{};
struct Bar2 : public Bar {};
struct NotBar{};
void do_something(const Foo<Bar> &){
cout<<"In Foo do something"<<endl;
}
void do_something(std::string f){
cout<<"In string do something"<<endl;
}
int main() {
const char * string = "string";
do_something(string);
Bar2 bar2;
Foo<Bar> fb(&bar2);
NotBar nb;
do_something(&bar2);
//Foo<Bar> fb2(&nb);// this SHOULD fail
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0ICBGb297CkZvbyhUKiB0KTpfdCh0KXt9ClQgKiBfdDsKfTsKCnN0cnVjdCBCYXJ7fTsKc3RydWN0IEJhcjIgOiBwdWJsaWMgQmFyIHt9OwpzdHJ1Y3QgTm90QmFye307Cgp2b2lkIGRvX3NvbWV0aGluZyhjb25zdCBGb288QmFyPiAmKXsKCWNvdXQ8PCJJbiBGb28gZG8gc29tZXRoaW5nIjw8ZW5kbDsKfQoKdm9pZCBkb19zb21ldGhpbmcoc3RkOjpzdHJpbmcgZil7CgkJY291dDw8IkluIHN0cmluZyBkbyBzb21ldGhpbmciPDxlbmRsOwoKfQoKaW50IG1haW4oKSB7Cgljb25zdCBjaGFyICogc3RyaW5nID0gInN0cmluZyI7Cglkb19zb21ldGhpbmcoc3RyaW5nKTsKCUJhcjIgYmFyMjsKCUZvbzxCYXI+IGZiKCZiYXIyKTsKCU5vdEJhciBuYjsKCWRvX3NvbWV0aGluZygmYmFyMik7CgkvL0ZvbzxCYXI+IGZiMigmbmIpOy8vIHRoaXMgU0hPVUxEIGZhaWwgCglyZXR1cm4gMDsKfQ==