#include <iostream>
using namespace std;

template<typename T> class SmartPtr
{
public:
	SmartPtr(T* data): member(data) {}
	
	T& operator * ()	
	{
		cout << "T& operator* called" << endl;
		return *member; 
	}
	
	T*& operator () ()
	{
		cout << "T*& operator () called" << endl;
		return member;
	}
	
	operator T * () 
	{
		cout << "operator T* called" << endl;
		return member;
	}
	
	T* member;
};

int main() {
	int x = 10;
	SmartPtr<int> pT = SmartPtr<int>(&x);
	static_cast<int*>(pT);
	return 0;
}