3

is there an better way to set a variables to one of its limits than

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

especially when initializing

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

I normally do not want to use the type in such expressions since its easy to miss this if type is changed.

4

3 回答 3

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;
}
于 2016-05-04T10:23:01.297 回答
1

汽车呢?

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

只有一处提到了类型。

于 2016-05-04T10:06:56.383 回答
1

回覆

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

这很容易:

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一个模板变量,出于某种我从未见过解释的原因,有些人更喜欢。

于 2016-05-04T10:07:38.630 回答