2010-08-10 46 views
1

我需要兩個有關整數的特徵。如果該類型的行爲像的整數,並且其表示爲真:整數特徵(is_integer,is_integral)

  1. 第一個會像std::is_integral(或boost::is_integral),但與用戶定義的類型可使用(例如類中封裝一個int,說int_wrapper)像標準整數類型(例如sizeof(T) * CHAR_BITS == std::numeric_limits<T>::digits,如果T是無符號的)但整數類型的定義非常嚴格,因爲它包含了這些類型的列表。所以如果專門化std::is_integral似乎很難,如果不禁止的話(儘管沒有明確說明我認爲):is_integral是一個「主要」類型特徵(20.7.4.1,注3:對於類型T只有一個主要類型特徵是真實的,在我的例子中爲int_wrapper已經有is_class等於真)。 如果我專門針對int_wrapper這個特質,我會採取什麼風險? 你知道一個符合我需求的特質類(例如Boost)嗎?

  2. 我需要的第二個特徵是具有整數語義的類型(包括位算術運算,位操作等)。例如來自GMP的mpz_class將滿足這個特徵。 std::numeric_limits<T>::is_integer是否適合這種特質?我同時認爲,如果T的行爲類似於整數,而且(在C++標準中)術語「整數」和「整數」是同義詞(在這種情況下,我們總是應該有numeric_limits<T>::is_integer == is_integral<T>::value

    numeric_limits<T>::is_integer == true

總之,我是否更好地爲自己的確切需求定義自己的特質,或嘗試擴展標準特性?

回答

2

這取決於你是否希望boost和其他標準庫將你的類視爲整體。如果是這樣,你沒有其他辦法,但專精std/boost :: is_integral <>。否則,請將您自己的is_integral <>的默認實現轉發到std/boost :: is_integral <>,並將其專門用於您的集成包裝。