Ten problem był już omawiany kilka razy, ale wszystkie znalezione przeze mnie rozwiązania albo nie działały, albo były oparte na statycznym dowodzie doładowania. Mój problem jest prosty. Mam klasę i chcę tylko zezwolić na prawdziwe typy (podwójne i zmienne). Chcę, aby wystąpił błąd podczas kompilacji, gdy próbuję utworzyć instancję klasy z typem innym niż float lub double. Używam Visual C++ 11. Oto, co próbowałem:Jak ograniczyć klasę szablonów do określonych typów wbudowanych?
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);
}
Wszelkie pomysły? Z góry dziękuję!
Pierwsze pytanie brzmi, czy to ma znaczenie? Jeśli tworzysz szablon z innym typem, a typ nie może być traktowany tak, jak szablon oczekuje, że go potraktuje, kompilacja się nie powiedzie. A jeśli to możliwe, pozwalając * tylko * te dwa typy skutecznie zakazują ... powiedzmy ... typ taki jak BigDecimal. – cHao
Visual Studio naprawdę wydaje ostrzeżenie, gdy static_assert nie działa, a nie błąd? Brzmi jak błąd. –
Zobacz także [szablony C++, które akceptują tylko niektóre typy] (http://stackoverflow.com/q/874298/) i [Ogranicz parametr szablonu C++ do podklasy] (http://stackoverflow.com/q/3175219).One wyprzedzają C++ 11, ale mogą zrobić dobry marker dla kogoś innego. – jww