template<bool> struct Range;

template<int val, typename = Range<true> >
class Param
{
public:
  typedef char type;
};

template<int val>
class Param<val, Range<(0 <= val && val <= 100)> >
{
public:
  typedef int type;
};

template<int val>
class Param<val, Range<(100 < val && val <= 175)> >
{
public:
  typedef double type;
};

int main ()
{
  Param<200>::type *p1 = new char;
  Param<100>::type *p2 = new int;
  Param<110>::type *p3 = new double;
}
