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

plo*_*ong 4 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()

我以前从没用过它.再次感谢您提供了许多明智的回复.

ale*_*xkr 8

template<typename T>
T get_lim( const T & x)
{
 return numeric_limits<T>::max();
}
Run Code Online (Sandbox Code Playgroud)

好的是你可以在不明确指定T的情况下使用它:

size_t l = get_lim(34);

  • 当然,这不会给你一个编译时常量。在 C++0x 中,这可能是一个 `constexpr`,你可以获得一个编译时常量。 (2认同)

New*_*biZ 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();
};
Run Code Online (Sandbox Code Playgroud)

或者只是创建一个小型返回结构:

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();
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 5

只是FWIW,C++ 0x也会有decltype,这几乎是一样的typeof.他们选择了一个新名称,主要是因为语义在一种情况下是不同的.typeof(gcc)的现有实现从类型中删除引用,因此typeof(int &) == int.该标准要求decltype(int &) == int&.这并不常见,但他们决定使用不同的名称来防止对现有代码进行任何静默更改.