获得变量限制的优雅方式

时间:2016-05-04 10:01:11

标签: c++ coding-style numeric-limits

是否有更好的方法将变量设置为其限制之一而不是

varname = std::numeric_limits<decltype(varname)>::max();

特别是初始化时

int64_t varname = std::numeric_limits<decltype(varname)>::max();

我通常不想在这样的表达式中使用该类型,因为如果类型被更改,很容易错过。

3 个答案:

答案 0 :(得分:2)

只是为了完整性,避开合法性的边缘:

#include <iostream>
#include <limits>

template<class T>
  T biggest(T&)
{
  return std::numeric_limits<T>::max();
}

int main()
{
  std::int64_t i = biggest(i);
  std::cout << i << std::endl;
  return 0;
}

答案 1 :(得分:1)

汽车怎么样?

auto varname = std::numeric_limits<int64_t>::max();

只有一个地方提到这种类型。

答案 2 :(得分:1)

RE

  

我通常不想在此类表达式中使用该类型,因为如果更改了类型,很容易错过。

这很简单:

auto varname = std::numeric_limits<int64_t>::max();

您可以通过多种方式降低std::numeric_limits的详细程度,例如通过模板别名或通过定义函数模板。

template< class Type >
using Limits_ = std::numeric_limits<Type>;

auto varname = Limits_<int64_t>::max();

template< class Type >
constexpr auto max_of() -> Type { return std::numeric_limits<Type>::max(); }

auto varname = max_of<int64_t>();

在C ++ 14及更高版本中,您可以将max_of设为模板变量,由于某种原因,我从未见过解释,有些人更喜欢。