#include <iostream>
using namespace std;
template<typename T> class IsFundamental{
public:
enum { Yes = 0, No = 1 };
};
template<> class IsFundamental<int>{
public:
enum { Yes = 1, No = 0 };
};
#define MK_FUND_TYPE(T) \
template<> class IsFundamental<T>{ \
public: \
enum { Yes = 1, No = 0 }; \
}
MK_FUND_TYPE(double);
MK_FUND_TYPE(float);
MK_FUND_TYPE(char);
MK_FUND_TYPE(void);
MK_FUND_TYPE(bool);
//MK_FUND_TYPE(int);
//...........
class MyType{};
int main()
{
if(IsFundamental<int>::Yes)
std::cout << "Ok..\n";
if(IsFundamental<float>::Yes)
std::cout << "Ok..\n";
if(IsFundamental<int*>::Yes)
std::cout << "((((..\n";
if(IsFundamental<MyType>::Yes)
std::cout << "((((..\n";
return 0;
}