using namespace std;
//============================================================================================!
#define PREDEFINE(anytype) template<typename anytype>
#define SPECIALISEDTEMPLATE(Class,SpecialType)		template<> class Class<SpecialType>
//============================================================================================!
PREDEFINE(Precision)
class MyClass
{
public :
	MyClass();
	void Foo(Precision A);
	PREDEFINE(Precision2)	void  Foo(Precision2 B);

private :	
	Precision mA;
};
//=======================================================================================!
template<typename Precision>
MyClass<Precision>::MyClass()
:mA((Precision) -1)
{

}
//=======================================================================================!
template<typename Precision>
void MyClass<Precision>::Foo(Precision A)
{
	//Do something here
	mA = A;
}
//=======================================================================================!
template<typename Precision>
PREDEFINE(Precision2)void MyClass<Precision>::Foo(Precision2 B )
{
	mA = (Precision)B;
}
//=======================================================================================!
//											Template Specialization
//=======================================================================================!
SPECIALISEDTEMPLATE(MyClass,bool)
{
public :	
	void Foo()
	{
		mA = true;
	}
	MyClass():mA(false){}
private :
	bool mA;
};
//========================================================================================!
int main()
{
	MyClass<int> obj;
	obj.Foo(25.f);
	obj.Foo(25);
	obj.Foo(25.000000011);
	MyClass<bool> SpecialedObj;
	SpecialedObj.Foo();
	return 0;
}