2013-03-19 8 views
5

Zastanawiam się, czy możliwe jest ograniczenie typu szablonu do typu zmiennej o określonym rozmiarze? Zakładając, że chce przyjąć 4 bajtów zmienną i odrzuca wszystkie inne, jeśli ten kod działa na jakiś kompilator gdzie sizeof (int) == 4 i sizeof (bool) == 1:Ogranicz typ szablonu C++ do określonego rozmiaru zmiennej

template <class T> FourOnly {...}; 
FourOnly<int> myInt; // this should compile 
FourOnly<bool> myBool; // this should fail at compilation time 

Każdy pomysł? Dzięki!

+0

Wygląda na to, że pytasz o odpowiedź na coś, co "myślisz", jest rozwiązaniem większego problemu. Dlaczego tego potrzebujesz? –

+1

@Zadirion Wprowadziłem zaciemnioną zmienną int (int, która jest de/zaciemniana w locie za każdym razem, gdy jest używana, ale jest przechowywana jako zaciemniona na stercie). Obfuskacja to po prostu tasowanie bitów za pomocą trochę masek i przesuwanie. Próbowałem stworzyć szablon, aby zastosować go do każdego typu prymitywnego o tym samym rozmiarze (mógłbym używać tych samych masek do tasowania). – Marco83

+0

aaaah, ciekawe! Interesujący przypadek użycia może okazać się przydatny: D +1! –

Odpowiedz

10

Można użyć statycznego twierdzenie:

template <class T> FourOnly 
{ 
    static_assert(sizeof(T)==4, "T is not 4 bytes"); 
}; 

Jeśli nie ma odpowiedniego wsparcia C++ 11, można rzucić okiem na boost.StaticAssert.

+1

* dostępne od C++ 11. – neagoegab

2

Można użyć std::enable_if zabronić kompilację gdy sizeof(T) nie jest 4.

template<typename T, 
     typename _ = typename std::enable_if<sizeof(T)==4>::type 
     > 
struct Four 
{}; 

Jednak wolałbym rozwiązanie w other answerstatic_assert.

+0

Dzięki za poświęcony czas. Inna odpowiedź wspomina o dostępności zaczynającej się od C++ 11, a co z tym rozwiązaniem? – Marco83

+0

Nie jestem pewien, czy 'enable_if' jest dostępny w przestrzeni nazw' tr1' dla kompilatorów przed C++ 11. Ale jest dostępny od Boost. – Praetorian

+0

@ Marco83 to samo dotyczy, chociaż istnieje [boost :: enable_if] (http://www.boost.org/doc/libs/1_53_0/libs/utility/enable_if.html), który ma zasadniczo tę samą funkcjonalność. – juanchopanza

Powiązane problemy