2016-05-04 50 views
1

初始化優雅的方式來獲得一個變量限制

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

時,我通常不希望使用的是有一個更好的方式來設置一個變量,它的一個限值比

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

特別鍵入這樣的表達式,因爲如果類型改變,它很容易錯過。

+1

我安裝一個變量的模板:模板' constexprŤMAX_VAL =標準:: numeric_limits :: MAX();'和然後使用'auto v = max_val ;'。在C++ 17中,我將模板'inline'並將其粘貼到標題中。 –

回答

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一個模板變量,由於某種原因,我從來沒有見過解釋說,有些人喜歡。

1

汽車呢?

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

只有一個地方提到這種類型。

1

而只是爲了完整性,踢腳上合法性的邊緣:

#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; 
} 
+0

我其實認爲這是最簡潔的方法。你認爲在這裏不合法? –

+0

@MarcinZukowski它是合法的,但它只需要一個維護者以某種方式使用該參數的值,並且它變成了UB。 –

相關問題