C++ 获得变量限制的优雅方法

C++ 获得变量限制的优雅方法,c++,coding-style,numeric-limits,C++,Coding Style,Numeric Limits,有没有更好的方法将变量设置为其极限之一 varname = std::numeric_limits<decltype(varname)>::max(); varname=std::numeric_limits::max(); 尤其是在初始化时 int64_t varname = std::numeric_limits<decltype(varname)>::max(); int64_t varname=std::numeric_limits::max(); 我通常

有没有更好的方法将变量设置为其极限之一

varname = std::numeric_limits<decltype(varname)>::max();
varname=std::numeric_limits::max();
尤其是在初始化时

int64_t varname = std::numeric_limits<decltype(varname)>::max();
int64_t varname=std::numeric_limits::max();
我通常不想在此类表达式中使用该类型,因为如果类型发生更改,则很容易忽略该类型。

自动如何

auto varname = std::numeric_limits<int64_t>::max();
auto varname=std::numeric_limits::max();
只有一个地方提到了该类型。

Re

我通常不想在此类表达式中使用该类型,因为如果类型发生更改,则很容易忽略该类型

这很简单:

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

模板
constexpr auto max_of()->类型{return std::numeric_limits::max()}
auto varname=max_of();

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

仅为了完整性,在合法性的边缘绕开:

#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;
}
#包括
#包括
模板
T最大(T&)
{
返回std::numeric_limits::max();
}
int main()
{
std::int64_t i=最大(i);

我可以安装一个变量模板:
template constexpr T max\u val=std::numeric\u limits::max()
然后使用
auto v=max_val;
。在C++17中,我会将模板
内联
,并将其粘贴在标题中。我实际上认为这是最简洁的方式。您认为这里什么不合法?@MarcinZukowski它是合法的,但只需要一个维护人员以某种方式使用参数的值,它就会变成UB。
template< class Type >
constexpr auto max_of() -> Type { return std::numeric_limits<Type>::max(); }

auto varname = max_of<int64_t>();
#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;
}