+6  A: 
template<typename T>
T get_lim( const T & x)
{
 return numeric_limits<T>::max();
}

the good thing is that you can use it without explicitly specifying T:

size_t l = get_lim(34);

AlexKR
of course, this doesn't give you a compile-time constant. In C++0x this could be a `constexpr` and you could get a compile-time constant.
rlbond
`min` and `max` do not return `size_t`. They should return T (this seems obvious).
Aurélien Vallée
Snippet from numeric_limits: template <class T> class numeric_limits { public: static T min() throw(); static T max() throw(); };
Aurélien Vallée
@Aurélien Vallée: you are right, but I can return size_t since I wrote the function. Anyway I have this corrected. Thanx. :)
AlexKR
Slightly more general: template<typename T>std::numeric_limits<T> NumericLimitsOf(const T}
Éric Malenfant
+1  A: 

numeric_limits<typeof(a)> works with GCC. (If you have it in standards-compliant mode, you may need to use __typeof__ instead.)

ephemient
+1  A: 

numeric_limits is what is known as a type trait. It stores information relative to a type, in an unobtrusive way.

Concerning your question, you can just define a template function that will determine the type of the variable for you.

template <typename T>
T valued_max( const T& v )
{
  return numeric_limits<T>::max();
};

template <typename T>
T valued_min( const T& v )
{
  return numeric_limits<T>::min();
};

or just create a small type returning structure:

template <typename T>
struct TypeOf
{
  typedef T type;
};

template <typename T>
TypeOf<T> type_of( const T& v )
{
  return TypeOf<T>();
}

int a;
numeric_limits<type_of(a)::type>::max();
Aurélien Vallée
Sadly, I don't think that "type_of(a)::type" is legal. If such a simple trick would have worked, Boost.Typeof would have not existed :)
Éric Malenfant
@Eric You're right. I just checked and type_of(a)::type cannot appear in a constant expression, such as a template parameter :(@Plong: I found a link to an explanation of how to implement it properly. I checked in boost, and they are using the same trick, see : http://www.peousware.com/implementer-un-typeof-et-un-foreach-en-c/
Aurélien Vallée
+1  A: 

Just FWIW, C++ 0x will also have decltype, which is nearly the same as typeof. They picked a new name primarily because the semantics are different in one case. The existing implementation of typeof (gcc) drops references from types, so typeof(int &) == int. The standard requires that decltype(int &) == int&. This doesn't matter very often, but they decided to use a different name to prevent any silent changes to existing code.

Jerry Coffin