|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 211
|
[C++] Restringere tipo template (come Java: <T extends Base>)
Ciao, so che non esiste un modo diretto per poter restringere il tipo che un parametro di un template può diventare. Quello che volevo chiedere è come ci si comporta in questi casi?
Voglio dire, io in java posso definire: Codice PHP:
In C++ si fa il casting normalmente o si chiamano metodi dati per scontato senza preoccuparsi di quale tipo sia il template? Considerato che il compilatore a volte da informazioni completamente generiche sull'errore commesso e quindi chi userà quel determinato codice potrebbe non capire. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 13043
|
Potresti usare le static_assertion di C++11 insieme ai type traits:
Codice:
#include <iostream>
#include <type_traits>
class Base
{
public:
virtual void hello() = 0;
};
class Specific : public Base
{
public:
virtual void hello() {
printf("Hello World!\n");
}
};
class Another {
void hello() {
}
};
template<class T>
class Wrapper
{
T object;
public:
Wrapper() {
static_assert(std::is_base_of<Base, T>::value, "T must be a Base type");
}
void hello() {
object.hello();
}
};
int main(void)
{
Wrapper<Another> w; // non compila (se usi Wrapper<Specific> compila)
w.hello();
return 0;
}
Codice:
example.cc: In instantiation of ‘Wrapper<T>::Wrapper() [with T = Another]’: example.cc:44:22: required from here example.cc:33:9: error: static assertion failed: T must be a Base type |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 211
|
Molto interessante, ma rispetto a static_cast, è di molto più inefficiente?
Inoltre, static_assert sarebbe un costrutto del linguaggio che permette di generare un qualsiasi errore nel compilatore in base ad una condizione oppure è pensato per altro? Grazie per l'aiuto. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 13043
|
Quote:
static_assert è una asserzione a compile time, ma la condizione dev'essere appunto verificabile a tempo di compilazione (in C++11 hanno anche introdotto la keyword constexpr che ti può aiutare nel costruire espressioni valutabili a tempo di compilazione). In realtà anche static_cast dovrebbe fare dei controlli sul tipo a tempo di compilazione (sicuramente più che quelli del cast C classico), però dal mio punto di vista quella sopra è una soluzione più "elegante" Ultima modifica di WarDuck : 15-10-2014 alle 08:38. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:39.




















