2010-10-13 51 views
3

我會假設這是C++標準中涵蓋的,但我一直無法找到它。我正在編寫一些模板,它們將對它們的非類型積分參數進行算術運算,並且我發現在template <int x> Foo這樣的模板中需要參數'x'的相當於MAX_INT如何確定模板非類型整型常量參數中的位數?

理想情況下,有人可以將我指向標準中的段落(如果存在的話),該段落給出了整型模板參數大小的允許範圍,以及確定特定實現上實際位數的任何方式。

-
澄清:它將作爲元編程庫的一部分在類型系統內進行數學運算的模板。 'int'永遠不會被實例化,並且永遠不會佔用運行時存儲空間。在很多方面,它類似於預處理器所做的數學運算,在這種情況下,我知道整型不能保證與'int'的大小相同。我正在尋找的是標準的一部分,它說明了類型是否相同,如果不是,編譯期間模板整型參數使用了多少位。

回答

2

在這裏看到:http://www.boost.org/doc/libs/1_41_0/libs/integer/integer_traits.html

編輯:其實這不是給你有關標準的任何信息,但是你可以得到編譯時對於某些類型的最小值和最大值。

編輯2:根據您的更新,我建議您使用boost.mpl,boost.type_traits和前面提到的boost.integer_traits庫。

Boost還提供了一個名爲cstdint.hpp(boost.integer庫的一部分)的頭文件,它定義類似boost :: uint32_t或boost :: int32_t的類型,這將確保您獲得支持32位的類型。 (當然也用於8,16和64位)

boost.type_traits例如,你可以比較兩種類型,如果它們相等。你會爲它使用boost::is_same

Boost MPL爲您提供編譯時算法,使條件等和整數特徵將爲您提供編譯時間的方式來獲得類型的限制。

HTH

+0

我已經在使用boost.mpl。如果它解決了我的問題,我還沒有找到它。 integer_traits庫對我來說似乎也沒用,因爲這些值不是整型常量表達式,所以不能在模板數學中使用。 – swestrup 2010-10-13 20:52:19

+0

boost :: integer_traits :: const_min和boost :: integer_traits :: const_max絕對是編譯時常量。對於[在多種類型之間進行選擇](http://www.boost.org/doc/libs/1_44_0/libs/mpl/doc/refmanual/type-selection.html)(或值,但它們表示爲包含值(在boost.mpl中)或值[基於某些條件](http://www.boost.org/doc/libs/1_44_0/libs/mpl/doc/refmanual/comparisons.html)([包括邏輯運算]( http://www.boost.org/doc/libs/1_44_0/libs/mpl/doc/refmanual/logical-operations.html))boost.mpl非常適合。 – Vinzenz 2010-10-13 21:07:53

+0

也有[按位操作,其他人可以看到元函數列表](http://www.boost.org/doc/libs/1_44_0/libs/mpl/doc/refmanual/metafunctions.html) – Vinzenz 2010-10-13 21:09:23

4

請參閱numeric limits。對於std::numeric_limits<>::digits文檔說:

對於整數類型:在表示非符號位(基數基位)的數目。 對於浮點類型:尾數中的位數(以小數爲基數)(等同於FLT_MANT_DIG,DBL_MANT_DIG或LDBL_MANT_DIG)。

編輯

還有其他的方法,如min()max()等。

+0

我如何知道編譯時模板計算使用的int大小與運行時相同?預處理器沒有。 – swestrup 2010-10-13 20:01:49

+0

@swestrup:模板引擎知道(並使用)運行時類型。預處理器沒有。 – Potatoswatter 2010-10-13 20:50:35