C ++在编译时获取对象类型,例如numeric_limits <typeof <a>&gt; :: max()?</typeof <a>

时间:2009-10-16 17:02:29

标签: c++ types typeof

鉴于int a;,我知道以下内容会返回a可以容纳的最大值。   

numeric_limits<int>::max()

但是,我想在不知道aint的情况下获得相同的信息。我想做这样的事情:   

numeric_limits<typeof<a>>::max()
没有这种确切的语法,但使用ISO C ++甚至可能吗?


谢谢,所有。AurélienVallée的type_of()最接近,但我不想在我们的代码库中添加任何额外内容。由于我们已经使用Boost,ÉricMalenfant对Boost.Typeof的引用促使我使用

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

我之前从未使用过它。再次感谢您提供了许多明智的回复。

5 个答案:

答案 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()

另请参阅Difference between decltype and typeof?