2010-05-13 16 views
17

alın. Şablon parametresi her zaman bir tamsayı türü olacak bir şablon sınıfı tanımlamak istiyorum. Sınıf, T tipinden biri ve diğeri ise T türünün imzasız varyantı olarak - yani T == int ise, o zaman T_Unsigned == unsigned int. İlk içgüdüm bunu yapmaktı:Bir tamsayı şablonu parametresinin imzalı/imzasız varyantını, açık özellikleri olmayan

Ama işe yaramıyor. Sonra şöyle, kısmi şablon uzmanlık kullanma hakkında düşündüm: Bu işler

template <typename T> struct UnsignedType {}; // deliberately empty 
template <> struct UnsignedType<int> { 
    typedef unsigned int Type; 
}; 

template <typename T> class Range { 
    typedef UnsignedType<T>::Type T_Unsigned; 
    /* ... */ 
}; 

, çok uzun kısmen her tamsayı türü için UnsignedType uzmanlaşmak olarak. Biraz daha fazla kopyalama-yapıştırma işi (makroların mantıklı kullanımını kesmek) ama kullanışlı olabilir.

Ancak, şimdi merak ediyorum - bir Tamsayı türünün imzalanmasını ve/veya tür başına işaret türünü manuel olarak tanımlamak zorunda kalmadan, bir türün imzasız varyantını kullanmanın başka bir yolu var mı? Yoksa bunu yapmanın tek yolu bu mu?

cevap

20

cevap tip kullanım std imzalanan-lik :: is_signed ve std :: eklemek için

is_unsigned belirleme için <type_traits>

içindedir/imzalı-lik kaldırarak, std :: make_signed var ve std :: make_unsigned

+0

+1. :) –

3

TR1/C++ 0x özelliklerine bağlı olarak istemiyorsanız veya istemiyorsanız, Boost.TypeTraits ayrıca make_unsigned<> ve diğerlerini de sunar. "Neden bunu düşünmedim" cevabı için

+0

+1 - olduğu gibi ben ' 'desteği olmayan Visual Studio 2005 kullanıyorum - bu yüzden bir alternatifi kullanışlıdır. Standart Kütüphane'nin bir parçası olarak cevabı hala “” olarak kabul ediyorum. –

+0

@Blair: Dikkat, bu aslında * "bir parçası olacak" * - henüz olmayan bir sonraki standardın parçası. –

İlgili konular