bool x=conversion <double,int>::exists// Modern C++ Design, by Andrei Alexandrescu, 2001// page 36template <class T, class U>class Conversion{ typedef char Small; class Big {char dummy[2];}; static Small Test (const U&); static Big Test (...); static T MakeT(); public: enum {exists = sizeof (Test (MakeT()) ) == sizeof (Small) };};Compilerclass Conversion{ typedef char Small; class Big {char dummy[2];}; static Small Test (const int&); static Big Test (...); static double MakeT(); public: enum {exists = sizeof (Test (MakeT()) ) == sizeof (Small) };};1check return of MakeT()double2choose Test function3Small Test (const int&)Is there the conversion from double to int?1YesXIs there the conversion from double to int?Test ( MakeT() )What Test function returns?4Smallsizeof(Small)==sizeof(Small)true5exists = true (i.e. 1)1existsXreturn6trueContent of this data flow is a type.Content of a data flow is shown with dashes,A type is shown with the same box as a Moduledouble MakeT();Small Test (const int&);Big Test (...);bool x=conversion <char,char*>::exists// Modern C++ Design, by Andrei Alexandrescu, 2001// page 36template <class T, class U>class Conversion{ typedef char Small; class Big {char dummy[2];}; static Small Test (const U&); static Big Test (...); static T MakeT(); public: enum {exists = sizeof (Test (MakeT()) ) == sizeof (Small) };};Compilerclass Conversion{ typedef char Small; class Big {char dummy[2];}; static Small Test (const char*&); static Big Test (...); static char MakeT(); public: enum {exists = sizeof (Test (MakeT()) ) == sizeof (Small) };};1check return of MakeT()char2choose Test function3Big Test(...)Is there the conversion from char to char*?1NoXIs there the conversion from char to char*?Test ( MakeT() )What Test function returns?4Bigsizeof(Big)==sizeof(Small)false5exists = false (i.e. 0)1existsXreturn6falsechar MakeT();Small Test (const int&);Big Test (...);class Big {char dummy[2];};typedef char Small;This function takes any argumenthasTHE SAMEhas