2012-09-28 35 views
-2

不使用#ifstdint.hinttypes.h,或編譯器特定的擴展(比非標準固有類型等),但使遊離使用所有其他的C++特性(包括C++ 11 type_traits例如)是有可能寫出具有當且僅當有一個特定於實現的類型,提供的精度至少64位,並以其他方式產生一個編譯時間的檢測64位整數型式而不預處理器或stdint.h

typedef {some implementation-specific type} int_least64; 

效果代碼錯誤?

的構建體應檢測到可能具有期望的性質(例如,在MSVC __int64 ++)非標準固有類型以及標準酮(longlong long)。如果有幾種類型符合要求,它應該選擇最合適的資格。理想情況下,在enable_if中使用以及只是出錯並檢測任意大的整數(例如,一些編譯器現在提供__int128)是可以概括的。

+8

爲什麼你不直接使用? –

+0

「檢測」是什麼意思?這包括你不知道的類型嗎? C++不支持反射。 –

+1

這不可能或不可取。 –

回答

2

不,你不能。程序沒有設施來反省實現中可用的類型,並且給定一個非限定名稱,但是沒有辦法在程序中使用它,使得程序繼續保持良好狀態,即使名稱不是表示一種類型。

這是向C++中添加cstdint以及C99兼容性動機的一部分。

0

如果問題是MSVC和<cstdint>,請至少升級到MSVS2010或自行爲Windows編寫它。這並不難。

可以使用一些模板技巧,但它仍然需要long long來獲得(或超過)64位整數。

我從SO C++休息室(即@StackedCrooked)一個人得到了它:

https://github.com/rubenvb/KISS/blob/master/include/types.hxx#L47

+0

或者只是使用多年來一直與[Boost.Integer](http://www.boost.org/libs/integer/)一起提供的那個。 – ildjarn