Dieses Problem wurde ein paar Mal diskutiert, aber alle Lösungen, die ich gefunden habe, funktionierten entweder nicht oder basierten auf der statischen Behauptung von Boost. Mein Problem ist einfach. Ich habe eine Klasse und möchte nur echte Typen zulassen (Double und Float). Ich möchte einen Fehler bei der Kompilierung, wenn ich versuche, die Klasse mit einem anderen Typ als float oder double zu instanziieren. Ich benutze Visual C++ 11. Hier ist was ich versucht habe:Wie schränke ich eine Vorlagenklasse auf bestimmte integrierte Typen ein?
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);
}
Irgendwelche Ideen? Danke im Voraus!
Die erste Frage ist, ist es wichtig? Wenn Sie die Vorlage mit einem anderen Typ instanziieren und der Typ nicht so behandelt werden kann, wie es die Vorlage erwartet, schlägt die Kompilierung fehl. Und wenn es möglich ist, erlaubt * nur * diese beiden Arten effektiv zu verbieten ... sagen ... einen Typ wie BigDecimal. – cHao
Visual Studio wirklich eine Warnung ausgeben, wenn static_assert fehlschlägt, und kein Fehler? Klingt wie ein Fehler. –
Siehe auch [C++ - Vorlagen, die nur bestimmte Typen akzeptieren] (http://stackoverflow.com/q/874298/) und [C++ - Vorlagenparameter auf Unterklasse beschränken] (http://stackoverflow.com/q/3175219).Sie sind älter als C++ 11, aber sie könnten ein guter Marker für jemand anderen sein. – jww