鉴于int a;
,我知道以下内容会返回a
可以容纳的最大值。
numeric_limits<int>
::max()
但是,我想在不知道a
是int
的情况下获得相同的信息。我想做这样的事情:
numeric_limits<typeof<a>>
::max()
没有这种确切的语法,但使用ISO C ++甚至可能吗?
type_of()
最接近,但我不想在我们的代码库中添加任何额外内容。由于我们已经使用Boost,ÉricMalenfant对Boost.Typeof的引用促使我使用
numeric_limits<BOOST_TYPEOF(m_focusspeed)>
::max()
我之前从未使用过它。再次感谢您提供了许多明智的回复。
答案 0 :(得分:8)
template<typename T>
T get_lim( const T & x)
{
return numeric_limits<T>::max();
}
好处是您可以在不明确指定T:
的情况下使用它size_t l = get_lim(34);
答案 1 :(得分:5)
numeric_limits是所谓的类型特征。它以不引人注目的方式存储与类型相关的信息。
关于您的问题,您只需定义一个模板函数,它将为您确定变量的类型。
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();
};
或只创建一个小型返回结构:
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();
答案 2 :(得分:5)
只是FWIW,C ++ 0x也会有decltype
,这与typeof
几乎相同。他们选择了一个新名称,主要是因为语义在一种情况下是不同的。 typeof
(gcc)的现有实现会从类型中删除引用,因此typeof(int &) == int
。该标准要求decltype(int &) == int&
。这并不常见,但他们决定使用不同的名称来防止对现有代码进行任何静默更改。
答案 3 :(得分:1)
numeric_limits<typeof(a)>
与GCC合作。 (如果您在符合标准的模式下使用它,则可能需要使用__typeof__
。)
答案 4 :(得分:1)
Starting with C++11,您可以使用decltype()
:
numeric_limits<decltype(a)>::max()