Questo problema è stato discusso alcune volte ma tutte le soluzioni che ho trovato o non funzionavano o erano basate sull'asserzione statica di boost. Il mio problema è semplice Ho una classe e voglio solo consentire i tipi reali (double e float). Voglio un errore in fase di compilazione se provo a istanziare la classe con un tipo diverso da float o double. Sto usando Visual C++ 11. Ecco cosa ho provato:Come si limita una classe template ad alcuni tipi built-in?
template <typename RealType>
class A
{
// Warning C4346
static_assert(std::is_same<RealType, double>::value || std::is_same<RealType, float>::value);
}
template <typename RealType>
class A
{
// Error C2062: type 'unknown' unexpected
static_assert(decltype(RealType) == double || decltype(RealType) == float);
}
Qualche idea? Grazie in anticipo!
La prima domanda è, cosa importa? Se si crea un'istanza del modello con un altro tipo e il tipo non può essere trattato nel modo in cui il modello si aspetta di trattarlo, la compilazione avrà esito negativo. E se è possibile, permettendo * solo * quei due tipi effettivamente fuorilegge ... diciamo ... un tipo come BigDecimal. – cHao
Visual Studio genera davvero un avviso quando static_assert fallisce, e non un errore? Sembra un insetto. –
Vedere anche [Modelli C++ che accettano solo determinati tipi] (http://stackoverflow.com/q/874298/) e [Limita i parametri del modello C++ alla sottoclasse] (http://stackoverflow.com/q/3175219).Precedono C++ 11, ma potrebbero essere un buon indicatore per qualcun altro. – jww