- #include <memory> 
- #include <iostream> 
-   
- 	template<class T> 
- 	struct call_with_pointer { 
- 		// last resort: T* 
- 		template<class Callable> 
- 		static auto call(Callable &callable, const std::shared_ptr<T> ¶m) -> decltype(callable(param.get())) { 
- 			return callable(param.get()); 
- 		} 
- 	}; 
-   
- 	template<class T> 
- 	struct call_with_shared : public call_with_pointer<T> { 
-   
- 		// best: call with shared_ptr<T>. 
- 		// SFINA 
- 		template<class Callable> 
- 		static auto call(Callable &callable, const std::shared_ptr<T> ¶m) -> decltype(callable(param)) { 
- 			return callable(param); 
- 		} 
-   
- 		using call_with_pointer<T>::call; 
-   
- 	}; 
-   
-   
- class Test { 
- public: 
- 	bool operator () (int * x) { 
- 		return *x == 42; 
- 	} 
- }; 
-   
- using namespace std; 
-   
- int main (int argc, const char * argv[]) 
- { 
- 	{ 
- 		Test t; 
-   
- 		auto i = std::make_shared<int>(4); 
-   
- 		auto x = call_with_shared<int>::call(t, i); 
- 	} 
-   
- 	return 0; 
- } 
-   
				I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKCXRlbXBsYXRlPGNsYXNzIFQ+CglzdHJ1Y3QgY2FsbF93aXRoX3BvaW50ZXIgewoJCS8vIGxhc3QgcmVzb3J0OiBUKgoJCXRlbXBsYXRlPGNsYXNzIENhbGxhYmxlPgoJCXN0YXRpYyBhdXRvIGNhbGwoQ2FsbGFibGUgJmNhbGxhYmxlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtKSAtPiBkZWNsdHlwZShjYWxsYWJsZShwYXJhbS5nZXQoKSkpIHsKCQkJcmV0dXJuIGNhbGxhYmxlKHBhcmFtLmdldCgpKTsKCQl9Cgl9OwoJCgl0ZW1wbGF0ZTxjbGFzcyBUPgoJc3RydWN0IGNhbGxfd2l0aF9zaGFyZWQgOiBwdWJsaWMgY2FsbF93aXRoX3BvaW50ZXI8VD4gewoJCQoJCS8vIGJlc3Q6IGNhbGwgd2l0aCBzaGFyZWRfcHRyPFQ+LgoJCS8vIFNGSU5BCgkJdGVtcGxhdGU8Y2xhc3MgQ2FsbGFibGU+CgkJc3RhdGljIGF1dG8gY2FsbChDYWxsYWJsZSAmY2FsbGFibGUsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0pIC0+IGRlY2x0eXBlKGNhbGxhYmxlKHBhcmFtKSkgewoJCQlyZXR1cm4gY2FsbGFibGUocGFyYW0pOwoJCX0KCQkKCQl1c2luZyBjYWxsX3dpdGhfcG9pbnRlcjxUPjo6Y2FsbDsKCgl9OwoKCmNsYXNzIFRlc3QgewpwdWJsaWM6Cglib29sIG9wZXJhdG9yICgpIChpbnQgKiB4KSB7CgkJcmV0dXJuICp4ID09IDQyOwoJfQp9OwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluIChpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3ZbXSkKewoJewoJCVRlc3QgdDsKCQoJCWF1dG8gaSA9IHN0ZDo6bWFrZV9zaGFyZWQ8aW50Pig0KTsKCQoJCWF1dG8geCA9IGNhbGxfd2l0aF9zaGFyZWQ8aW50Pjo6Y2FsbCh0LCBpKTsKCX0KCQoJcmV0dXJuIDA7Cn0K