2011-07-18 21 views
8

I'am próbuje wykonać tę pracę:C++ szablonu non-type typ parametru odliczenie

template < typename T, T VALUE > 
void   f() 
{ 
    /* ... */ 
} 

int    main() 
{ 
    f<10>(); // implicit deduction of [ T = int ] ?? 
    return (0); 
} 

Celem jest uproszczenie o wiele bardziej złożone szablon.

Po wielu przeszukaniach, nie znajduję żadnego sposobu by zrobić to na C++ 0x, więc stackoverflow jest moją ostatnią deską ratunku.

  • bez określenia wszelkiego rodzaju T możliwe ...
  • jestem na g ++ C++ 0x, tak sexy rzeczy jest dozwolone.
+0

'10' nie jest tak naprawdę nazwą typu. Również C++ zezwala tylko na pewne typy liczb całkowitych dla twojego drugiego argumentu szablonu 'T'. Dlaczego po prostu nie skorzystasz z największego dostępnego tam typu? –

Odpowiedz

5

C++ 0x wprowadza decltype(), który robi dokładnie to, co chcesz.

int main() 
{ 
    f<decltype(10), 10>(); // will become f<int, 10>(); 
    return 0; 
} 
2

Nie sądzę, że możesz to zrobić, po prostu musisz poinformować kompilator, że istnieje typ. Najbliższy rzeczą, którą mogę pomyśleć, to coś takiego:

template <class T> 
void f(T x) { 
    // do something with x 
} 

f(10); 

Poza tym, przypuszczam, że można po prostu założyć trochę i zrobić coś takiego:

template<size_t x> 
void f() { 

} 

f<10>(); 

z których żaden nie jest całkiem co Cię chce, ale przyzwoity kompilator powinien być w stanie zrobić dużo tego czasu kompilacji, mimo że podajesz stałą.

Czy możesz wyjaśnić, co próbujesz osiągnąć? Czy typy niecałkowite będą dozwolone? Dlaczego nie pokazujesz nam bardziej skomplikowanego szablonu, który próbujesz uprościć?

5

Nie ma automatycznego odliczania szablonów dla klas/klas w C++. Co można zrobić, choć jest mniej więcej tak (uwaga, niesprawdzonych!):

#define F(value) f<decltype(value), value> 

template < typename T, T VALUE > 
void   f() 
{ 
    /* ... */ 
} 

int    main() 
{ 
    F(10)(); 
    return (0); 
} 

To nie jest tak czysty, jak szablon tylko kodu, ale jest jasne, co robi i pozwala uniknąć obciążeń powtarzających się. Jeśli potrzebujesz go do pracy na kompilatorach 0x 0x ++, możesz użyć Boost.Typeof zamiast decltype.

Powiązane problemy