std:: is_scalar
|
Definiert im Header
<type_traits>
|
||
|
template
<
class
T
>
struct is_scalar ; |
(seit C++11) | |
std::is_scalar
ist ein
UnaryTypeTrait
.
Falls
T
ein
Skalartyp
ist, liefert die Konstante
value
den Wert
true
. Für jeden anderen Typ ist
value
false
.
Wenn das Programm Spezialisierungen für
std::is_scalar
oder
std::is_scalar_v
hinzufügt, ist das Verhalten undefiniert.
Inhaltsverzeichnis |
Template-Parameter
| T | - | ein zu prüfender Typ |
Hilfsvariablen-Template
|
template
<
class
T
>
constexpr bool is_scalar_v = is_scalar < T > :: value ; |
(seit C++17) | |
Geerbt von std:: integral_constant
Member-Konstanten
|
value
[static]
|
true
wenn
T
ein Skalartyp ist,
false
andernfalls
(öffentliche statische Member-Konstante) |
Member-Funktionen
|
operator bool
|
konvertiert das Objekt zu
bool
, gibt
value
zurück
(öffentliche Member-Funktion) |
|
operator()
(C++14)
|
gibt
value
zurück
(öffentliche Member-Funktion) |
Member-Typen
| Typ | Definition |
value_type
|
bool |
type
|
std:: integral_constant < bool , value > |
Hinweise
Jede einzelne Speicherstelle im C++-Speichermodell, einschließlich der versteckten Speicherstellen, die von Sprachmerkmalen verwendet werden (z.B. Zeiger auf die virtuelle Tabelle), hat einen skalaren Typ (oder ist eine Folge angrenzender Bitfelder mit einer Länge ungleich Null). Die Reihenfolge von Nebeneffekten in der Ausdrucksauswertung, die Synchronisation zwischen Threads und die Abhängigkeitsordnung werden alle in Bezug auf einzelne skalare Objekte definiert.
Mögliche Implementierung
template<class T> struct is_scalar : std::integral_constant<bool, std::is_arithmetic<T>::value || std::is_enum<T>::value || std::is_pointer<T>::value || std::is_member_pointer<T>::value || std::is_null_pointer<T>::value> {}; |
Tags wurde gemäß den Anforderungen nicht übersetzt, da es sich um C++-Code handelt. Die HTML-Struktur und Attribute wurden ebenfalls unverändert beibehalten.*
Beispiel
#include <iostream> #include <type_traits> #include <typeinfo> #include <utility> template<typename Head, typename... Tail> void are_scalars(Head&& head, Tail&&... tail) { using T = std::decay_t<decltype(head)>; std::cout << typeid(T).name() << " is " << (std::is_scalar_v<T> ? "" : "not ") << "a scalar\n"; if constexpr (sizeof... (Tail)) { are_scalars(std::forward<decltype(tail)>(tail)...); } } int main() { struct S { int m; } s; int S::* mp = &S::m; enum class E { e }; are_scalars(42, 3.14, E::e, "str", mp, nullptr, s); }
Mögliche Ausgabe:
int is a scalar double is a scalar main::E is a scalar char const* is a scalar int main::S::* is a scalar nullptr is a scalar main::S is not a scalar
Siehe auch
|
(C++11)
|
prüft, ob ein Typ ein arithmetischer Typ ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Aufzählungstyp ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Zeigertyp ist
(Klassentemplate) |
|
(C++11)
|
prüft, ob ein Typ ein Zeiger auf eine nicht-statische Memberfunktion oder ein nicht-statisches Memberobjekt ist
(Klassentemplate) |