plong
plong

Reputation: 1753

C++ Get object type at compile time, e.g., numeric_limits<typeof<a>>::max()?

Given int a;, I know that the following returns the largest value that a can hold.

numeric_limits<int>::max()

However, I'd like to get this same information without knowing that a is an int. I'd like to do something like this:

numeric_limits<typeof<a>>::max()
Not with this exact syntax, but is this even possible using ISO C++?


Thanks, all. Aurélien Vallée's type_of() comes closest, but I'd rather not add anything extra to our codebase. Since we already use Boost, Éric Malenfant's reference to Boost.Typeof led me to use

numeric_limits<BOOST_TYPEOF(m_focusspeed)>::max()

I'd never used it before. Again, thanks for so many well-informed responses.

Upvotes: 5

Views: 14078

Answers (5)

Oliver
Oliver

Reputation: 29571

Starting with C++11, you can use decltype():

numeric_limits<decltype(a)>::max()

See also Difference between decltype and typeof?.

Upvotes: 1

Jerry Coffin
Jerry Coffin

Reputation: 490338

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.

Upvotes: 7

NewbiZ
NewbiZ

Reputation: 2518

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();

Upvotes: 6

alexkr
alexkr

Reputation: 4670

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);

Upvotes: 9

ephemient
ephemient

Reputation: 204886

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

Upvotes: 1

Related Questions